assert tlf.z >= tlb.z, (tlf.z,trf.z)
AssertionError: (0.5, 0.5)
可以看出,我遇到了精确问题。我怎样才能改写断言,以便传递足够接近的值(软糖因子应该有多大?)然后固定rhs,如果它实际上小于lhs,那么它会变得严格相等?
答案 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.z
和tlb.z
与EPSILON
完全不同时,它才会被评估为真,这不是我们想要的。相反,我们希望它们之间的差异小于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实际上是正确的。对不起:)