我创建了一个类Matrix
来对浮点矩阵进行数学运算(基本运算,逆运算,...)。
浮点精度使测试它们变得困难。通常,如果测试逆运算,如果矩阵的行列式接近于零,则误差可能很大。
如何对这些操作进行单元测试?
我创建了一个类Matrix
来对浮点矩阵进行数学运算(基本运算,逆运算,...)。
浮点精度使测试它们变得困难。通常,如果测试逆运算,如果矩阵的行列式接近于零,则误差可能很大。
如何对这些操作进行单元测试?
有许多选项可能适合您的目标。
对于每个单独的输出元素,您可以根据对其有贡献的输入值设置该元素中允许的误差。(在复合运算的情况下,例如乘以矩阵,然后乘以它的逆矩阵,您仍将根据对最终值有贡献的所有值来设置容差。)
您可以选择行列式不接近零的输入矩阵进行测试。
您可以计算结果矩阵与理想结果的距离,并确定该距离是否超出您的误差容限,而不是测量单个元素中的误差。(例如,将两个矩阵相减,将元素的平方相加,然后取平方根。有关“距离”的其他概念和矩阵运算中的误差,请参考此页。)
请记住,测试的目的是发现错误。这表明如果阈值小于错误可能导致的任何差异的大小,则可以使用非常大的容错度。也就是说,考虑代码中可能出现的错误类型:对错误元素的引用、数组外部的引用、操作遗漏等等。通常,这些错误会导致结果出现非常大的错误。只要您的测试捕捉到这些错误,它们就达到了它们的目的。
理想情况下,您会将运算的计算结果与理想结果进行比较,而不是反转运算并与原始输入进行比较。如果理想结果不可用,您可以使用扩展精度与更精确的计算结果进行比较。如果这通常不可用,那么您可以使用一组准备好的表现良好的矩阵进行比较,例如在各种位置(以及其他地方为零)只有几个简单元素(例如,小整数)的矩阵。将使用不同的输入矩阵重复每个测试,以便组合测试集涵盖必要的情况。但是每个测试都会有简单的输出,预期很少或没有舍入误差。