一尘不染

为什么在python中,非常大的float值之间的比较会失败?

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上运行的。


阅读 196

收藏
2021-01-20

共1个答案

一尘不染

在运行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价值。

2021-01-20