为什么在 python 中非常大的浮点值之间的比较失败?

Why do comparisions between very large float values fail in python?

提问人:AFoeee 提问时间:10/28/2018 最后编辑:AFoeee 更新时间:10/28/2018 访问量:212

问:

在我的理解中,是最大可能的浮点值。但是,似乎比较如此大的值是失败的。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-3.x 比较 相等 largenumber

评论

1赞 dangee1705 10/28/2018
你看过十进制模块吗?
1赞 Jean-François Fabre 10/28/2018
浮点吸收

答:

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