我有一个类向量表示三维空间中的一个点。这个向量有一个方法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 != 5
或AssertionError: 5.000000000000001 != 5
。
注意:我知道浮点问题可能在Vector.length
属性或Vector.normalize()
中。
1) 我怎样才能确保测试有效?
使用
assertAlmostEqual
,assertNotAlmostEqual
。从official documentation:
通过计算差值、四舍五入到给定的小数位数(默认为7)并与零进行比较来测试第一个和第二个近似相等。
2) 在不测试近似值的情况下可以这样做吗?
本质上没有
无法绕过floating point issue,因此您要么“舍入”由
vec.normalize
给出的结果,要么接受几乎相等的结果(两者中的每一个都是近似值)。我认为一种可能性是将函数应用于所有输入、所有中间计算的结果和输出都可以由
float
精确表示的测试用例。举例说明:
但不确定这有多实际。。。
相关问题 更多 >
编程相关推荐