3

我想知道标准中是否有某些内容,例如 a#define或某些numeric_limits内容可以告诉我浮点类型的整数部分中基数为 10 位的最大位数。

例如,如果我有一些浮点类型,其最大值是:1234.567。我想要标准中定义的东西,它会告诉我 4 那种类型。

我可以选择这样做吗?

template <typename T>
constexpr auto integral_digits10 = static_cast<int>(log10(numeric_limits<T>::max())) + 1;
4

2 回答 2

2

正如 Nathan Oliver 在评论中指出的那样,C++ 提供std::numeric_limits<T>::digits10.

该类型可以不改变表示的以 10 为基的位数T,即任何具有这么多十进制位数的数字都可以转换为类型的值T并返回十进制形式,而不会因四舍五入或溢出而改变。对于基radix类型,它是digitsdigits浮点类型为 -1)乘以log 10 ( radix) 并向下取整的值。

Rick Regan 在这里对此进行了解释。总之,如果您的二进制浮点格式可以在有效数字中存储b位,那么您可以保证能够往返d十进制数字,其中d是最大整数,使得

10< 2 b -1

对于IEEE754 binary64double当今大多数系统上的 C++ 标准),则b = 53,并且 2 b -1 = 4,503,599,627,370,496,因此只能保证格式能够表示d = 15 位。

但是,此结果适用于所有数字,而您只询问整数部分。然而,我们可以通过选择x = 2 b +1轻松找到一个反例,这是格式无法表示的最小整数:对于 binary64,这是 9,007,199,254,740,993,它也恰好有 16 位,因此需要四舍五入

于 2016-09-30T08:36:40.143 回答
1

您正在寻找的价值是max_exponent10

是最大的正数 n,使得 10 n是浮点类型的可表示的有限值

因为这个关系:

日志10 x = n
10 n = x

你的计算是在寻找一个方程的工作方式:

log10(numeric_limits<T>::max())

的定义max_exponent10解释它使用 10 n + 1将大于numeric_limits<T>::max()但 10 n小于或等于numeric_limits<T>::max()您正在寻找的也是如此。numeric_limits<T>::max_exponent10

请注意,您仍然需要+ 1示例中的 as 来说明 1 的位置。(因为 log 10 1 = 0)所以您需要表示的基于 10 的位数numeric_limits<T>::max()将是:

numeric_limits<T>::max_exponent10 + 1

如果您想手动验证,可以在此处查看:

http://coliru.stacked-crooked.com/a/443e4d434cbcb2f6

于 2016-09-30T13:51:12.117 回答