当加上小于无穷大的最大浮点数时,得到无穷大的最小数是多少



python中最大的数字应该是:

l=2**(1023)*(2-2**(-52))

1.7976931348623157e+308

这可以通过以下指令进行验证:

sys.float_info.max

1.7976931348623157e+308

但是,请参阅以下

1.0000000000000000000000000001*l

1.7976931348623157e+308

现在:

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

ε=$2^{-52}$是计算机

请参阅:

l = sys_float_info.max
(1+0.5*epsilon)*l

1.7976931348623157e+308

(1+0.51*epsilon)*l

inf

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

>>> 1.0000000000000000000000000001
1.0

二进制浮点不是所见即所得-它在所有阶段都要四舍五入到机器精度。

继续以上内容:

>>> 1.0000000000000001
1.0
>>> 1.000000000000001
1.000000000000001

所以1.000000000000001是这种形式中最小的文字,它不能精确地四舍五入到1.0。然后:

>>> sys.float_info.max * 1.000000000000001
inf

请注意,它足以乘以大于1的最小可表示浮点值,该浮点值略小于该文字的舍入值:

>>> import math
>>> math.nextafter(1.0, 100) * sys.float_info.max
inf
>>> 1.000000000000001 > math.nextafter(1.0, 100)
True

加法怎么样

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

>>> import math
>>> big = math.nextafter(math.inf, 0)
>>> big
1.7976931348623157e+308

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

>>> lastbit = math.ulp(big)
>>> lastbit
1.99584030953472e+292

当然,如果我们把它加到big上,它就会溢出到无穷大。事实的确如此:

>>> big + lastbit
inf

然而,即使加上一半也会溢出,这是由于";至最接近/偶数";四舍五入解决中间平局";向上":

>>> big + lastbit / 2.0
inf

小一点的行吗?不。任何小一点的东西都会被四舍五入后扔掉;向下";。在这里,我们尝试添加下一个最小的可表示浮点,并看到它没有效果:

>>> big + math.nextafter(lastbit / 2.0, 0)
1.7976931348623157e+308

最新更新