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

发布于 2021-01-29 14:59:38

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

关注者
0
被浏览
83
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看