首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在二重的最小/最大值范围内,是否有双不能表示的整数?

在二重的最小/最大值范围内,是否有双不能表示的整数?
EN

Stack Overflow用户
提问于 2013-10-20 02:43:54
回答 1查看 5.4K关注 0票数 16

我意识到,当一个人处理IEEE 754双倍和浮动时,有些数字不能被表示,特别是当一个人试图在小数点之后用很多数字来表示数字时。这是很好理解的,但我很好奇,在双(或浮点数)的最小/最大值范围内是否有任何无法表示的整数,因此需要舍入到最近的可表示的IEEE 754表示?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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次。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19473352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档