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

时间:2018-10-28 09:49:50

标签: python python-3.x compare equality largenumber

据我了解,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。上运行的。

2 个答案:

答案 0 :(得分:1)

也许如果您尝试打印这些数字,您会更好地理解它们是什么:

instance_variable_set

请注意,打印输出并不能完全描述浮点数精度可能遇到的所有问题,但是在这种情况下,“问题”是微不足道的。您可以看到只有最后一个数字不同。

答案 1 :(得分:1)

在运行Python的典型计算机上,Python浮点数有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值。