Unittest(有时)失败,因为浮点不精确

2024-05-15 21:41:59 发布

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

我有一个类向量表示三维空间中的一个点。这个向量有一个方法normalize(self, length = 1),它将向量向下/向上缩放为length == vec.normalize(length).length

由于浮点数的不精确性,这种方法的unittest有时会失败。我的问题是,当方法正确实现时,如何确保此测试不失败?是否可以在不进行近似值测试的情况下进行



其他信息

    def testNormalize(self):
        vec = Vector(random.random(), random.random(), random.random())
        self.assertEqual(vec.normalize(5).length, 5)

这有时会导致AssertionError: 4.999999999999999 != 5AssertionError: 5.000000000000001 != 5

注意:我知道浮点问题可能在Vector.length属性或Vector.normalize()中。


Tags: 方法self信息情况randomunittest向量length
2条回答

1) 我怎样才能确保测试有效?

使用assertAlmostEqualassertNotAlmostEqual

official documentation

assertAlmostEqual(first, second, places=7, msg=None, delta=None)

通过计算差值、四舍五入到给定的小数位数(默认为7)并与零进行比较来测试第一个和第二个近似相等。

2) 在不测试近似值的情况下可以这样做吗?

本质上没有

无法绕过floating point issue,因此您要么“舍入”由vec.normalize给出的结果,要么接受几乎相等的结果(两者中的每一个都是近似值)。

我认为一种可能性是将函数应用于所有输入、所有中间计算的结果和输出都可以由float精确表示的测试用例。

举例说明:

In [2]: import math

In [4]: def norm(x, y):
   ...:     return math.sqrt(x*x + y*y)
   ...: 

In [6]: norm(3, 4) == 5
Out[6]: True

但不确定这有多实际。。。

相关问题 更多 >