首页 文章

在双倍的MIN / MAX范围内,双重不能代表整数吗?

提问于
浏览
14

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

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

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

1 回答

  • 22

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

    所有不超过 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次 .

相关问题