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

2024-05-13 15:07:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

可以看出,我正遭受精度问题的困扰。如何重新措辞断言,使其传递足够接近的值(fudge因子应该有多大?)然后修复右弦,它应该比左弦更小,这样它就变得严格相等了吗?在


Tags: 精度assert断言因子fudgetrf措辞assertionerror
2条回答

试试这个:

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

从本质上讲,你必须定义你对“大于或等于”的容忍度,并对其作出解释。在

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

我认为威尔1给出的答案不正确。
让我解释一下。在

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

如果tlf.z > tlb.z为真,即使差小于EPSILON,那么{}也将为真。不管EPSILON值多少。正确的形式是:
tlf.z > tlb.z + EPSILON
至于第二个表达式tlf.z == tlb.z - EPSILON,只有当tlf.z和{}完全不同于{}时,它才会被计算为true,这不是我们想要的。相反,我们希望它们之间的差异小于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实际上是对的。对不起:)

相关问题 更多 >