当然,有些整数不能表示为双精度浮点数。
Pow(2, 53)
所有不超过或9007199254740992
的整数都是可表示的。从Pow(2, 53)
到Pow(2, 54)
(即18014398509481984
),只能表示偶数。奇数将被四舍五入。
当然,它会继续这样。从Pow(2, 54)
到Pow(2, 55)
只有 4 的倍数(4 除的整数)是可表示的,从Pow(2, 55)
到Pow(2, 56)
只有 8 的倍数,依此类推。
这是因为双精度浮点格式的尾数(有效位)有 53 位(二进制位)。
很容易验证我的说法。例如,将数字10000000000000001
作为integer64
. 将其转换double
为integer64
. 你会看到精度损失。
当您采用非常大的双精度数时,肯定只有很小百分比的整数是可表示的。例如,在附近1E+300
(在Pow(2, 996)
和之间),我们正在谈论( )Pow(2, 997)
的倍数。这与 a精确到大约 16 位小数这一事实是一致的。因此,一个包含 300 个数字的整数将仅在其第一个近似值时被“记住”。16 个数字(实际上是 53 个二进制数字)。Pow(2, 944)
1.4870169084777831E+284
double
加法:不能完全表示的十的第一个幂是1E+23
(或 100 六分之一,短尺度命名风格)。在该数字附近,只能表示16777216
(即Pow(2, 24)
) 的整数倍,但 10 的 23 次方显然不是 2 的 24 次方的倍数。质因数分解是10**23 == 2**23 * 5**23
,所以我们只能将 2 整除 23 次,而不是要求的 24 次。