.net - 使用浮点值进行单元测试

标签 .net unit-testing testing floating-point

我创建了一个类 Matrix 来对浮点矩阵进行数学运算(基本运算、求逆……)。

浮点精度使其难以测试。 通常,如果测试逆运算,如果矩阵的行列式接近于零,则误差可能很大。

如何对这些操作进行单元测试?

最佳答案

有许多选项可能适合您的目标。

对于每个单独的输出元素,您可以根据对其产生影响的输入值设置该元素的容许误差。 (在复合运算的情况下,例如乘以一个矩阵然后乘以它的逆,您仍然会根据对最终值有贡献的所有值来设置容差。)

您可以选择行列式不接近零的输入矩阵进行测试。

您可以计算结果矩阵与理想结果的距离,并确定该距离是否超出您的误差容限,而不是测量单个元素中的误差。 (例如,将两个矩阵相减,将元素的平方相加,然后取平方根。对于“距离”的其他概念和矩阵运算中的误差,请考虑 this page。)

请记住,测试的目的是发现错误。这表明如果阈值小于错误可能导致的任何差异的幅度,则可以使用非常大的容错度。也就是说,考虑您的代码中可能出现的错误类型:对错误元素的引用、对数组外部的引用、操作遗漏等等。通常,这些错误会导致结果出现非常大的错误。只要您的测试捕获到这些错误,它们就达到了目的。

理想情况下,您会将运算的计算结果与理想结果进行比较,而不是反转运算并与原始输入进行比较。如果理想结果不可用,您可以使用扩展精度与更精确的计算结果进行比较。如果这不是普遍可用的,那么您可以使用准备好的行为良好的矩阵集进行比较,例如在各种位置(和其他地方为零)只有几个简单元素(例如,小整数)的矩阵。将使用不同的输入矩阵重复每个测试,以便组合的测试集涵盖必要的情况。但是每个测试都会有简单的输出,几乎没有或没有预期的舍入误差。

关于.net - 使用浮点值进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589535/

相关文章:

.net - 有没有一种简单的方法可以向 CaSTLe Windsor 注册静态闭包?

unit-testing - 类代码前如何写单元测试?

android - Flex 移动自动化测试

c# - 在 ASP.Net Web API Controller 中如何找到用户名?

c# - 为什么这个内联if错了?

java - java中void方法的正确单元测试,无需模拟

javascript - Angular : How to spy on $element. 开启

python - 在禁用所有插件的情况下启动 pytest

perl - 我如何在 Perl 中进行单元测试?

java - 使用 java 以编程方式突出显示 MS Word 中的文本