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