我意识到,当一个人处理IEEE 754双倍和浮动时,有些数字不能被表示,特别是当一个人试图在小数点之后用很多数字来表示数字时。这是很好理解的,但我很好奇,在双(或浮点数)的最小/最大值范围内是否有任何无法表示的整数,因此需要舍入到最近的可表示的IEEE 754表示?
例如,非常大的数字有时以双倍或浮动表示,即使它们是整数。显然,使用直接向上的int64或一些这样的大整数数据类型会更好,但人们仍然经常对大数使用双倍。
有没有什么数字可以被称为非代表性的,或者你能给我一个数学上的理由,为什么它不会是个问题?
发布于 2013-10-20 07:11:29
当然,有些整数不能用双精度浮点数来表示.
所有不超过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。你会看到精确性的损失。
当你用非常大的双精度数字,当然很小的百分比,整个数字是可表示的。例如,在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,所以我们可以将两次平均除以23次,而不是按要求的24次。
https://stackoverflow.com/questions/19473352
复制相似问题