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*epsilon
和sys.float_info.max + 0.51*epsilon
如果epsilon = $2^{-52}$是计算机的epsilon。
见此:
l = sys_float_info.max
(1+0.5*epsilon)*l
1.7976931348623157e+308
(1+0.51*epsilon)*l
inf
发布于 2022-07-30 20:12:14
在第一种情况下,您实际上是在乘以1:
>>> 1.0000000000000000000000000001
1.0
二进制浮点不是WYSIWYG -它取决于返回到机器精度的所有阶段。
继续进行上述工作:
>>> 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
https://stackoverflow.com/questions/73178690
复制相似问题