在我看来,比较花车的一个好方法是用浮子来调整公差。这是个好主意吗?
此例程需要针对特殊数量进行扩展,例如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
答案 0 :(得分:0)
这是一个明智的想法,除非您比较可能是catastrophic cancellation结果的值(例如,减去两个附近的数字以产生一个非常小的,非常不准确的数字。)在这种情况下,我认为你应该通过预取消值的大小来扩展你的容差。
我不是数值计算/浮点专家。获得正确的东西很难,并且它有一个完整的堆栈交换:Computational Science.SE。这可能是该网站的一个很好的问题。您甚至可以要求主持人在那里移动现有问题。 (标记它。)
有些搜索结果显示:https://scicomp.stackexchange.com/questions/3362/relative-comparison-of-floating-point-numbers有几个关于FP比较的答案。