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