gpt4 book ai didi

floating-point - 在 double 的 MIN/MAX 范围内是否有 double 不能表示的整数?

转载 作者:行者123 更新时间:2023-12-03 21:30:15 26 4
gpt4 key购买 nike

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

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

是否有任何数字可以称为不可表示的,或者您能否给我一个数学原因,为什么它不会成为问题?

最佳答案

当然,有些整数不能表示为 double 浮点数。

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

这是因为 double-precision floating-point format尾数(有效数)有 53 位(二进制数字)。

验证我的主张很容易。例如,取数字 10000000000000001作为 integer64 .将其转换为 double然后回到 integer64 .您将看到精度损失。

当您采用非常大的 double 数时,当然可以表示整数的很小百分比。例如靠近 1E+300 (在 Pow(2, 996)Pow(2, 997) 之间)我们说的是 Pow(2, 944) 的倍数( 1.4870169084777831E+284 )。这与 double 的事实是一致的。精确到大约 16 位十进制数字。所以一个有 300 个数字的整数只会在它的第一个大约时被“记住”。 16 位数字(实际上是 53 位二进制数字)。

附加: 不能精确表示的十的第一个幂是 1E+23 (或 100 千分之一,短标命名风格)。在那个数附近,只有 16777216 的整数倍(即 Pow(2, 24) )是可表示的,但 10 的 23 次方显然不是 2 的 24 次方的倍数。质因数分解是 10**23 == 2**23 * 5**23 ,所以我们只能将 2 整除 23 次,而不是需要的 24 次。

关于floating-point - 在 double 的 MIN/MAX 范围内是否有 double 不能表示的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com