使用缩放容差来比较浮点数

时间:2015-10-25 00:52:17

标签: python floating-point compare floating-accuracy

在我看来,比较花车的一个好方法是用浮子来调整公差。这是个好主意吗?

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

1

输出:

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

1 个答案:

答案 0 :(得分:0)

这是一个明智的想法,除非您比较可能是catastrophic cancellation结果的值(例如,减去两个附近的数字以产生一个非常小的,非常不准确的数字。)在这种情况下,我认为你应该通过预取消值的大小来扩展你的容差。

我不是数值计算/浮点专家。获得正确的东西很难,并且它有一个完整的堆栈交换:Computational Science.SE。这可能是该网站的一个很好的问题。您甚至可以要求主持人在那里移动现有问题。 (标记它。)

有些搜索结果显示:https://scicomp.stackexchange.com/questions/3362/relative-comparison-of-floating-point-numbers有几个关于FP比较的答案。