首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是最小的数字,当添加到最大浮点数小于无穷大的结果是无穷大?

什么是最小的数字,当添加到最大浮点数小于无穷大的结果是无穷大?
EN

Stack Overflow用户
提问于 2022-07-30 20:03:16
回答 1查看 146关注 0票数 0

python中最大的数字应该是:

代码语言:javascript
运行
复制
l=2**(1023)*(2-2**(-52))

1.7976931348623157e+308

这一点可以通过以下指令加以验证:

代码语言:javascript
运行
复制
sys.float_info.max

1.7976931348623157e+308

但是,请参阅以下内容

代码语言:javascript
运行
复制
1.0000000000000000000000000001*l

1.7976931348623157e+308

现在:

代码语言:javascript
运行
复制
1.00006*l

inf

怎么一回事?对于哪个x发生了(1+x-ε) = 1.7976931348623157e+308和(1+x) = inf?

更新:

我相信在python中触发无穷大的最大数是

sys.float_info.max + 0.5*epsilonsys.float_info.max + 0.51*epsilon

如果epsilon = $2^{-52}$是计算机的epsilon。

见此:

代码语言:javascript
运行
复制
l = sys_float_info.max
(1+0.5*epsilon)*l

1.7976931348623157e+308

代码语言:javascript
运行
复制
(1+0.51*epsilon)*l

inf

EN

回答 1

Stack Overflow用户

发布于 2022-07-30 20:12:14

在第一种情况下,您实际上是在乘以1:

代码语言:javascript
运行
复制
>>> 1.0000000000000000000000000001
1.0

二进制浮点不是WYSIWYG -它取决于返回到机器精度的所有阶段。

继续进行上述工作:

代码语言:javascript
运行
复制
>>> 1.0000000000000001
1.0
>>> 1.000000000000001
1.000000000000001

因此,1.000000000000001是这种形式中最小的文字,它不完全等于1.0。然后:

代码语言:javascript
运行
复制
>>> sys.float_info.max * 1.000000000000001
inf

请注意,它足以乘以大于1的最小可表示浮点数,这比该文本的四舍五入值略小:

代码语言:javascript
运行
复制
>>> import math
>>> math.nextafter(1.0, 100) * sys.float_info.max
inf
>>> 1.000000000000001 > math.nextafter(1.0, 100)
True

那加法呢?

当例子显示乘法时,问题的标题问关于加法。所以我们也这么做吧。了解nextafter()ulp(),它们是处理此类问题的正确工具。首先,一种简单的计算方法可以找到最大的有限可表示浮子:

代码语言:javascript
运行
复制
>>> import math
>>> big = math.nextafter(math.inf, 0)
>>> big
1.7976931348623157e+308

现在,将lastbit设置为其最小有效位的值:

代码语言:javascript
运行
复制
>>> lastbit = math.ulp(big)
>>> lastbit
1.99584030953472e+292

当然,如果我们把它加到big中,它就会溢出到无穷大。它就是这样做的:

代码语言:javascript
运行
复制
>>> big + lastbit
inf

但是,添加一半也会溢出,因为“到最近/偶数”解决了“向上”的中间绑定:

代码语言:javascript
运行
复制
>>> big + lastbit / 2.0
inf

更小的东西能起作用吗?不是的。任何较小的东西都会被四舍五入的“倒下”抛弃。在这里,我们尝试添加下一个最小的可表示浮点,并看到它没有效果:

代码语言:javascript
运行
复制
>>> big + math.nextafter(lastbit / 2.0, 0)
1.7976931348623157e+308
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73178690

复制
相关文章

相似问题

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