Bre*_*ett 14 floating-point precision ieee-754
我意识到无论什么时候处理IEEE 754双打和浮点数,有些数字都无法表示,尤其是当一个数字试图表示小数点后面有大量数字的数字时.这是很好理解但我很好奇,如果在双(或浮点)的MIN/MAX范围内有任何整数不能表示,因此需要四舍五入到最接近的可表示的IEEE 754表示?
例如,非常大的数字有时以双精度或浮点数表示,即使它们是整数.显然使用直接向上的int64或一些这样的大整数数据类型会更好,但是人们仍然经常使用双数来表示大数.
有没有可以被称为不可表示的数字,或者你能给我一个数学上的原因,为什么它不会成为问题?
Jep*_*sen 22
当然,有些整数不能表示为双精度浮点数.
所有整数不超过Pow(2, 53)或者9007199254740992,是表示的.从Pow(2, 53)到Pow(2, 54)(这是18014398509481984),只有偶数是表示的.奇数将被舍入.
当然,它会继续这样.从4 Pow(2, 54)到Pow(2, 55)4的倍数(4个除以4的整数)可以表示,从8 Pow(2, 55)到Pow(2, 56)8的倍数,依此类推.
这是因为双精度浮点格式具有53位(二进制数字)用于尾数(有效数字).
很容易验证我的说法.例如,将数字10000000000000001作为integer64.将其转换为double然后再转换为integer64.你会看到精度损失.
当你采用非常大的双精度数字时,当然只占整数的一小部分是可以表示的.例如near 1E+300(在Pow(2, 996)和之间Pow(2, 997))我们正在谈论Pow(2, 944)(1.4870169084777831E+284)的倍数.这与a double精确到大约16个十进制数的事实是一致的.所以一个有300个数字的数字只会被它的第一个约"记住".16个数字(实际上是53个二进制数字).
增加:十个不能完全代表的力量是1E+23(或100个sextillions,短尺度命名风格).在该数字附近,只有16777216(也就是说Pow(2, 24))的整数倍可以表示,但是到第23次幂的十次显然不是24次幂的2的倍数.主要因素分解是10**23 == 2**23 * 5**23,因此我们可以将两次均匀分为两次,而不是根据需要分为24次.
| 归档时间: |
|
| 查看次数: |
3029 次 |
| 最近记录: |