关于浮点:在双精度的MIN / MAX范围内,是否有双重不能表示的整数?

Are there any whole numbers which the double cannot represent within the MIN/MAX range of a double?

我意识到无论什么时候处理IEEE 754双打和浮点数,有些数字都无法表示,尤其是当一个数字试图表示小数点后面有大量数字的数字时。 这是很好理解但我很好奇,如果在双(或浮点)的MIN / MAX范围内有任何整数不能表示,因此需要四舍五入到最接近的可表示的IEEE 754表示?

例如,非常大的数字有时以双精度或浮点数表示,即使它们是整数。 显然使用直接的int64或一些这样的大整数数据类型会更好,但是人们仍然经常使用双数来表示大数。

有没有可以被称为不可表示的数字,或者你能给我一个数学上的原因,为什么它不会成为问题?


当然,有些整数不能表示为双精度浮点数。

所有不超过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的倍数,依此类推。

这是因为双精度浮点格式具有53位(二进制数字)用于尾数(有效数字)。

很容易验证我的说法。例如,将数字10000000000000001设为integer64。将其转换为double,然后再转换为integer64。你会看到精度损失。

当你采用非常大的双精度数字时,当然只占整数的一小部分是可以表示的。例如,在1E+300(在Pow(2, 996)Pow(2, 997)之间),我们正在讨论Pow(2, 944)(1.4870169084777831E+284)的倍数。这与a double精确到大约16个十进制数的事实是一致的。所以一个有300个数字的数字只会被它的第一个约"记住"。 16个数字(实际上是53个二进制数字)。

增加:10个不能完全表示的第一个幂是1E+23(或100个sextillions,短刻度命名风格)。在该数字附近,只有16777216(即Pow(2, 24))的整数倍可以表示,但是到第23次幂的十次显然不是24次幂的2的倍数。主要因子分解10**23 == 2**23 * 5**23,因此我们可以将两次均分2次,而不是24次。