在单元测试中使用数值高精度的情况

时间:2012-01-20 19:26:41

标签: unit-testing precision

作为开发数值方法库的一部分,我经常添加单元测试。大多数Assert.AreEqual类型测试目前最多检查6位小数,因为这种类型的库不需要精度。到目前为止,这些测试在实现其目的方面效果很好。

最近,在处理相同库的64位版本时,我发现相当多的单元测试的结果在6位小数处是相同的,但是在小数点后10位或更远处发生变化。我如何首先发现这种情况是一个完全不同的故事,但追逐其中的一些导致解决了一些我从未知道存在的微妙错误。

这让我想到了一个问题:单元测试以高精度(例如,10-12位小数)检查数字似乎是有价值的,或者可能是完全精确的(甚至不确定如何做到这一点) ,即使库的精度要求不是那么高。这里的社区通常用什么来对科学/数字代码中的数值进行单元测试?任何建议/建议/指针?

更多信息:图书馆处理双重值。它不是财务图书馆等,所以我不使用小数。

1 个答案:

答案 0 :(得分:0)

我不认为你的问题有任何解决方案(不使用量子计算机)。我听说过两种可能性。

  1. 您正在使用具有有限表示的数字(理性且基于它们的所有数字)。在这种情况下,您可以简单地比较/测试那些具有完全精度的表示

  2. 表示不是有限的(非理性的,所有基于它们的)。在这种情况下,由于内存量有限,您无法以完全精度执行任何操作(包括测试)。你必须为你的操作选择精确度,然后你才能测试到那个精度。

  3. 还有'之间':

    • 您正在使用代数/符号计算而不是值计算。在这种情况下,即使你正在使用(比方说)实数,实际上你正在使用它的有限表示,如'pi','e'或'sqrt(3)'。这会带你进入#1

    • 你进行像sqrt(4)这样的操作,你的输入和输出来自#1,但你的计算过程通过#2,因此有其所有限制