正如 Nathan Oliver 在评论中指出的那样,C++ 提供std::numeric_limits<T>::digits10
.
该类型可以不改变表示的以 10 为基的位数T
,即任何具有这么多十进制位数的数字都可以转换为类型的值T
并返回十进制形式,而不会因四舍五入或溢出而改变。对于基radix
类型,它是digits
(digits
浮点类型为 -1)乘以log 10 ( radix
) 并向下取整的值。
Rick Regan 在这里对此进行了解释。总之,如果您的二进制浮点格式可以在有效数字中存储b位,那么您可以保证能够往返d十进制数字,其中d是最大整数,使得
10天< 2 b -1
对于IEEE754 binary64(double
当今大多数系统上的 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 位,因此需要四舍五入。