断言浮点值与有效数字容差相等

ste*_*855 6 python unit-testing assert scientific-computing

我正在尝试编写一个单元测试来检查工程分析的输出。我有理论值,我想根据对一定数量的有效数字的分析来检查这些值。所以,例如:

Ixx_ther = 0.000123
Iyy_ther = 0.0123

Ixx, Iyy = getI(*args, **kwargs)

self.assertAlmostEqual(Ixx_ther, Ixx, 6)
self.assertAlmostEqual(Iyy_ther, Iyy, 4)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我需要知道我要检查的数字,因为在两种情况下将容差设置为 6 都会使测试过于严格,而将其设置为 4 则会过于宽松。我需要的是测试是否等于相同数量的有效数字。理想的说法是:

Ixx_ther = 1.23E-4
Iyy_ther = 1.23E-2

Ixx, Iyy = getI(*args, **kwargs)

self.assertAlmostEqual(Ixx_ther, Ixx, 2)
self.assertAlmostEqual(Iyy_ther, Iyy, 2)
Run Code Online (Sandbox Code Playgroud)

并让断言语句删除指数并仅检查有效数是否相等。我想这以前已经做过了,但我一直无法找到一个内置函数来以这种方式断言相等。以前有人遇到过这个问题吗

问题

1)以前有人遇到过这个问题吗,并且知道工程分析单元测试的一般指南

2)是否有内置的解决方案。对于这个问题

3)是否有人已经编写了一个以这种方式工作的自定义断言语句?

ev-*_*-br 6

回复:是否有一个内置的解决方案:如果您可以作为numpy依赖项,请查看 numpy.testing

这是一个示例(来自assert_allclose文档的逐字记录):

>>> x = [1e-5, 1e-3, 1e-1]
>>> y = np.arccos(np.cos(x))
>>> assert_allclose(x, y, rtol=1e-5, atol=0)
Run Code Online (Sandbox Code Playgroud)

编辑:为了完整起见,这里是源代码的链接:assert_allclose将实际工作转发到np.allclose。这与 @Mark Ransom 的答案几乎相同(加上数组参数和无穷大的处理)。