我意识到无论什么时候处理IEEE 754双打和浮点数,有些数字都无法表示,尤其是当一个数字试图表示小数点后面有大量数字的数字时 . 这是很好理解但我很好奇,如果在双(或浮点)的MIN / MAX范围内有任何整数不能表示,因此需要四舍五入到最接近的可表示的IEEE 754表示?
例如,非常大的数字有时以双精度或浮点数表示,即使它们是整数 . 显然使用直接向上的int64或一些这样的大整数数据类型会更好,但是人们仍然经常使用双数来表示大数 .
有没有可以被称为不可表示的数字,或者你能给我一个数学上的原因,为什么它不会成为问题?
1 回答
当然,有些整数不能表示为双精度浮点数 .
所有不超过
Pow(2, 53)
或9007199254740992
的整数都可以表示 . 从Pow(2, 53)
到Pow(2, 54)
(即18014398509481984
),只有偶数可以表示 . 奇数将被舍入 .当然,它会继续这样 . 从
Pow(2, 54)
到Pow(2, 55)
只能表示4的倍数(4个除以4的整数),从Pow(2, 55)
到Pow(2, 56)
只有8的倍数,依此类推 .这是因为double-precision floating-point format具有53位(二进制数字)用于尾数(有效数字) .
很容易验证我的说法 . 例如,将数字
10000000000000001
作为integer64
. 将其转换为double
,然后再返回integer64
. 你会看到精度损失 .当你采用非常大的双精度数字时,当然只占整数的一小部分是可以表示的 . 例如,在
1E+300
(介于Pow(2, 996)
和Pow(2, 997)
之间)附近,我们正在讨论Pow(2, 944)
(1.4870169084777831E+284
)的倍数 . 这与double
精确到大约16个十进制数字的事实是一致的 . 所以一个有300个数字的整数将只有它的第一个约为"remembered" . 16个数字(实际上是53个二进制数字) .增加:十个不能完全代表的力量是
1E+23
(或100个sextillions,短尺度命名风格) . 在该数字附近,只有16777216
(也就是Pow(2, 24)
)的整数倍可以表示,但是到第23次幂的十次显然不是24次幂的2的倍数 . 主要因素分解为10**23 == 2**23 * 5**23
,因此我们可以将两次均分2次,而不是24次 .