pytest.approx 的 rel 参数背后的基本原理是什么?

问题描述 投票:0回答:1

pytest.approx
的文档提到了
rel
参数,但它没有明确define

这会按预期返回

True

>>> a = 1e-6
>>> b = 2e-6
>>> a == approx(b, abs=1e-6) # returns True

但是这会返回

False

>>> a = 1e-6
>>> b = 2e-6
>>> a == approx(b, rel=1e-6) # returns False

这里为什么要有一个

rel
参数?它的用例是什么?

它是否将

b
rel
相乘并将其视为公差?

提前致谢

pytest
1个回答
0
投票

这方面的文档可能不清楚,并假设您已经知道什么是相对公差。从本质上讲,相对容差允许您在同一尺度上比较两个数量,无论它们是小还是大。这个公式是

|value - expected_value| / |expected_value|
,你可以在wikipedia上了解更多:

TLDR - 简单的答案

a == approx(b, rel) <-> |b - a| / |b|  <= rel

左边的表达式等同于右边的表达式

处理0s

但是,有一个复杂的问题:如果 b 等于 0,则不能除以 0,这会导致问题。为了解决这个问题,开发人员增加了另一个复杂性,导致以下表达式:

现在,如果你只传递一个

abs
参数(省略
rel
),实际比较如下:

a == approx(b, rel, abs) <-> |b - a|  <= max(|rel * b|, abs)

注意,如果

b=0
那么
abs
用于断言差异。

特例

最后,有一个特殊情况,当你只传递绝对差时,表达式如下:

a == approx(b, rel, abs) <-> |b - a|  <= abs

文档实际上涵盖了这一点,但很难找到。希望这能为您阐明用途。

© www.soinside.com 2019 - 2024. All rights reserved.