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

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

最佳答案

在运行 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/

相关文章:

python 在磁盘上存储实时变量

python - pyqt 在现有的 GUI 小部件上绘图

types - Python方法包装器类型?

java - java中的有效性比较

php - 相同字符串的不同长度

将字符串与 if 条件进行比较

python 算法: how to efficiently find if two integer sets are intersected?

python - Selenium - 登录引发 ElementNotVisibleException

python - 为什么QWidget在继承时表现不同

python - Instagram 关闭 API 服务后,如何使用 python 将照片上传到 Instagram