根据我的理解,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 运行的。
最佳答案
在运行 Python 的典型机器上,Python float 有 53 位精度。如果您尝试更进一步,Python 将消除最小的部分,以便可以正确表示数字。
因此,值 1 被吸收或取消,以便能够表示您尝试计算的高值。
该限制是通过减去(或加上)乘以 float 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
值相关。
关于python - 为什么在Python中非常大的浮点值之间的比较会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030217/