Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试中使用数值高精度的实例_Unit Testing_Precision - Fatal编程技术网

Unit testing 单元测试中使用数值高精度的实例

Unit testing 单元测试中使用数值高精度的实例,unit-testing,precision,Unit Testing,Precision,作为开发数值方法库的一部分,我经常添加单元测试。大多数Assert.AreEqual类型测试目前最多检查6位小数,因为这种类型的库不需要超过这一精度。到目前为止,这些测试在达到目的方面发挥了巨大的作用 最近,在处理同一个库的64位版本时,我发现相当多的单元测试的结果在小数点后6位是相同的,但在小数点后10位或更高的位置会发生变化。首先,我是如何发现这一情况的,这是一个完全不同的故事,但追逐其中一些导致解决了一些我从未知道存在的微妙错误 这就引出了一个问题:让单元测试以高精度(例如,10-12位小

作为开发数值方法库的一部分,我经常添加单元测试。大多数Assert.AreEqual类型测试目前最多检查6位小数,因为这种类型的库不需要超过这一精度。到目前为止,这些测试在达到目的方面发挥了巨大的作用

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

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


更多信息:该库处理双重值。它不是一个金融图书馆等,所以我不使用十进制。

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

  • 您正在处理具有有限表示形式的数字(有理数以及所有基于它们的数字)。在这种情况下,您可以完全精确地比较/测试这些表示

  • 代表性不是有限的(非理性的,以及基于它们的一切)。在这种情况下,由于内存有限,您无法完全精确地执行任何操作(包括测试)。您必须为您的操作选择精度,然后您只能测试到该精度

  • 还有一件事是“介于”之间的:

    • 您使用的是代数/符号计算,而不是值计算。在这种情况下,即使您使用的是(比如)实数,实际上您使用的是它的有限表示形式,如“pi”、“e”或“sqrt(3)”。这就引出了#1

    • 您可以执行类似于计算sqrt(4)的操作,其中您的输入和输出来自#1,但是您的计算过程会通过#2,因此有其所有限制


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

  • 您正在处理具有有限表示形式的数字(有理数以及所有基于它们的数字)。在这种情况下,您可以完全精确地比较/测试这些表示

  • 代表性不是有限的(非理性的,以及基于它们的一切)。在这种情况下,由于内存有限,您无法完全精确地执行任何操作(包括测试)。您必须为您的操作选择精度,然后您只能测试到该精度

  • 还有一件事是“介于”之间的:

    • 您使用的是代数/符号计算,而不是值计算。在这种情况下,即使您使用的是(比如)实数,实际上您使用的是它的有限表示形式,如“pi”、“e”或“sqrt(3)”。这就引出了#1

    • 您可以执行类似于计算sqrt(4)的操作,其中您的输入和输出来自#1,但是您的计算过程会通过#2,因此有其所有限制


    如果要求函数返回精确到小数点后N位的答案,并且您的函数通过了一组精心选择的测试,那么您的函数是否将小数点后(N+1)位的所有内容随机化,或者将其设置为等于系统时间除以一个单位化指针都无关紧要。我猜你的问题的真正答案不是“使用更高的精度”,而是“使用更好的测试用例”。在JUnit中,你可以指定浮点比较所需的相等程度。你使用的是什么数据类型?您为库创建的东西,
    Decimal
    Float
    /
    Double
    ?因为如果是最后两个问题中的一个,我有个“坏”消息要告诉你…@X-Zero:更新了更多信息。@Samik R首先,测试不能证明缺陷的存在,只能证明缺陷的存在。考虑到这一点,看看您的测试在过去没有发现缺陷的地方。找出测试失败的原因,以及什么样的测试可能会发现问题。利用这些知识在将来开发更好的测试。但是请注意,如果您只需要N个有效数字,那么只会导致第N个数字之后的数字出错的“bug”不是缺陷;不要浪费时间修复不能显示大于60的数字的数字时钟。如果要求函数返回一个精确到小数点后N位的答案,并且您的函数通过了一组精心选择的测试,那么您的函数是否将第(N+1)位小数点后的所有内容随机化并不重要,或者将其设置为系统时间除以单位化指针。我猜你的问题的真正答案不是“使用更高的精度”,而是“使用更好的测试用例”。在JUnit中,你可以指定浮点比较所需的相等程度。你使用的是什么数据类型?您为库创建的东西,
    Decimal
    Float
    /
    Double
    ?因为如果是最后两个问题中的一个,我有个“坏”消息要告诉你…@X-Zero:更新了更多信息。@Samik R首先,测试不能证明缺陷的存在,只能证明缺陷的存在。考虑到这一点,看看您的测试在过去没有发现缺陷的地方。找出测试失败的原因,以及什么样的测试可能会发现问题。利用这些知识开发出更好的测试