15

我意识到,每当处理 IEEE 754 双精度和浮点数时,某些数字无法表示,尤其是当尝试表示小数点后有很多数字的数字时。这很好理解,但我很好奇是否有无法表示的双精度(或浮点数)的 MIN/MAX 范围内的整数,因此需要四舍五入到最接近的可表示 IEEE 754 表示?

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

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

4

1 回答 1

28

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

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. 将其转换doubleinteger64. 你会看到精度损失。

当您采用非常大的双精度数时,肯定只有很小百分比的整数是可表示的。例如,在附近1E+300(在Pow(2, 996)和之间),我们正在谈论( )Pow(2, 997)的倍数。这与 a精确到大约 16 位小数这一事实是一致的。因此,一个包含 300 个数字的整数将仅在其第一个近似值时被“记住”。16 个数字(实际上是 53 个二进制数字)。Pow(2, 944)1.4870169084777831E+284double


加法:不能完全表示的十的第一个幂是1E+23(或 100 六分之一,短尺度命名风格)。在该数字附近,只能表示16777216(即Pow(2, 24)) 的整数倍,但 10 的 23 次方显然不是 2 的 24 次方的倍数。质因数分解是10**23 == 2**23 * 5**23,所以我们只能将 2 整除 23 次,而不是要求的 24 次。

于 2013-10-20T07:11:29.297 回答