比较浮点不等式(在python中)

时间:2011-03-31 21:15:30

标签: python floating-point

assert tlf.z >= tlb.z, (tlf.z,trf.z)
AssertionError: (0.5, 0.5)

可以看出,我遇到了精确问题。我怎样才能改写断言,以便传递足够接近的值(软糖因子应该有多大?)然后固定rhs,如果它实际上小于lhs,那么它会变得严格相等?

2 个答案:

答案 0 :(得分:3)

试试这个:

EPSILON = 10 ** -12
assert tlf.z >= tlb.z - EPSILON, (tlf.z,trf.z)
tlf.z = max(tlf.z,tlb.z)

基本上,你必须定义你愿意为“大于或等于”而容忍的容忍度,并考虑它。

选择EPSILON的价值是一个难题。它取决于您的错误来源,以及该来源与比较之间的计算次数。如果计算很少,那么EPSILON的较小值是一个不错的选择。我会试试这个例子,如果你仍然发现问题就调整一下。

答案 1 :(得分:3)

我认为willm1给出的答案是正确的 让我解释。

以下表达式:
    tlf.z >= tlb.z - EPSILON
相当于:
    (tlf.z > tlb.z - EPSILON) or (tlf.z == tlb.z - EPSILON)

如果tlf.z > tlb.z为真,即使差异小于EPSILON,那么tlf.z > tlb.z - EPSILON也将为真。无论EPSILON的价值是什么。相反,正确的形式是:
    tlf.z > tlb.z + EPSILON
至于第二个表达式tlf.z == tlb.z - EPSILON,只有当tlf.ztlb.zEPSILON完全不同时,它才会被评估为真,这不是我们想要的。相反,我们希望它们之间的差异小于EPSILON
    abs(tlf.z - tlb.z) <= EPSILON

结论,tlf.z >= tlb.z - EPSILON应写成:
    (tlf.z > tlb.z + EPSILON) || (abs(tlf.z - tlb.z) <= EPSILON)

<强>更新
我正在查看一些代码,突然之间我注意到(tlf.z > tlb.z + EPSILON) || (abs(tlf.z - tlb.z) <= EPSILON)实际上等同于tlf.z >= tlb.z - EPSILON
当我们要查找相似度abs(tlf.z - tlb.z) <= EPSILON时,我们希望tlb.z位于以下灰色区域:

当我们正在寻找tlf.z > tlb.z + EPSILON时:

因此,我们真的在寻找:

这与tlf.z + EPSILON >= tlb.z相同(相当于tlf.z >= tlb.z - EPSILON) 在那种情况下,willm1实际上是正确的。对不起:)