当前位置: 代码迷 >> python >> 使用缩放公差比较浮点数
  详细解决方案

使用缩放公差比较浮点数

热度:111   发布时间:2023-06-13 17:18:00.0

在我看来,比较浮标的一种好方法是用浮标来缩放公差。 这是个好主意吗?

此例程需要扩展为特殊数量,例如NaN,+ /-Inf,但它提供了基本概念。

def FloatEq(a, b, ToleranceFactor=1e-6):
    if a == b: return True
    c = min(abs(a), abs(b))
    return(abs(a-b) < (c*ToleranceFactor))

a = 0.000000000001
b = 0.000000000001000000001

print('Straight compare ==', a==b)
print('FloatEq(,,1e-6) ==', FloatEq(a,b))
print('FloatEq(,,1e-10) ==', FloatEq(a,b,1e-10))

输出:

Straight compare == False
FloatEq(,,1e-6) == True
FloatEq(,,1e-10) == False

更新:

可以处理操作数之一为零的一种可能的解决方案。 它使用固定的,用户可配置的公差,而不是因素。

def FloatEq(a, b, ToleranceFactor=1e-6, ToleranceAtZero=None):
    if a == b:
        return True
    elif a==0 or b==0:
        c = a if b==0 else b
        if ToleranceAtZero is None:
            import sys
            # Ignoring denormalized numbers for now
            ToleranceAtZero = sys.float_info.min
        return abs(c) < ToleranceAtZero
    else:
        c = min(abs(a), abs(b))
        return(abs(a-b) < (c*ToleranceFactor))

这是一个明智的主意,除非您要比较可能是结果的值(例如,减去两个附近的数字以产生非常小的,非常不准确的数字)。在这种情况下,我认为您应该按取消前值的大小。

我不是数值计算/浮点专家。 正确处理这些问题很困难,并且有一个完整的 : 。 对于该网站,这可能是个好问题。 您甚至可以要求主持人将现有问题移到那里。 (标记它。)

出现了一些搜索: : ,其中包含有关FP比较的几个答案。

  相关解决方案