提问人:AFoeee 提问时间:10/28/2018 最后编辑:AFoeee 更新时间:10/28/2018 访问量:212
为什么在 python 中非常大的浮点值之间的比较失败?
Why do comparisions between very large float values fail in python?
问:
在我的理解中,是最大可能的浮点值。但是,似乎比较如此大的值是失败的。sys.float_info.max
import math
import sys
m = sys.float_info.max # type 'float'
m == m # True
m < m # False
m > m # False
m == m-1.0 # True
m < m-1.0 # False
m > m-1.0 # False
m == m-1e100 # True
m < m-1e100 # False
m > m-1e100 # False
m == m-1e300 # False
m > m-1e300 # True
m < m-1e300 # False
我想这是因为精度有限?如果是这样,我可以在什么数值范围内安全操作?
上面的代码是用 Python 3.5.2 运行的。
答:
1赞
zvone
10/28/2018
#1
也许如果你尝试打印这些数字,你会更好地理解它们是什么:
>>> sys.float_info.max
1.7976931348623157e+308
>>> sys.float_info.max - 1.0
1.7976931348623157e+308
>>> sys.float_info.max - 1e100
1.7976931348623157e+308
>>> sys.float_info.max - 1e300
1.7976931248623157e+308
请注意,打印输出几乎无法描述浮点数精度可能遇到的所有问题,但在这种情况下,“问题”是微不足道的。您可以看到只有最后一个数字不同。
1赞
Jean-François Fabre
10/28/2018
#2
在运行 Python 的典型机器上,Python 浮点数有 53 位精度可用。如果你尝试走得更远,Python 将删除最小的部分,以便可以正确表示数字。
因此,值 1 被吸收或抵消,以便能够表示您尝试计算的高值。
该限制是通过减去(或相加)值乘以浮点 epsilon 获得的。
在我的机器上:
maxfloat == 1.7976931348623157e+308
epsilon == 2.220446049250313e-16
示例测试代码
import math
import sys
m = sys.float_info.max # type 'float'
eps = sys.float_info.epsilon
print(m == m-(m*(eps/10))) # True
print(m == m-(m*eps)) # False
m*eps
是要使比较失败而必须减去的最小值。它始终与值相关。m
评论