问题描述
在我看来,比较浮标的一种好方法是用浮标来缩放公差。 这是个好主意吗?
此例程需要扩展为特殊数量,例如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))
1楼
这是一个明智的主意,除非您要比较可能是结果的值(例如,减去两个附近的数字以产生非常小的,非常不准确的数字)。在这种情况下,我认为您应该按取消前值的大小。
我不是数值计算/浮点专家。 正确处理这些问题很困难,并且有一个完整的 : 。 对于该网站,这可能是个好问题。 您甚至可以要求主持人将现有问题移到那里。 (标记它。)
出现了一些搜索: : ,其中包含有关FP比较的几个答案。