【发布时间】:2012-03-19 01:09:04
【问题描述】:
什么是“校验和”浮点数数组的快速简便方法,同时允许指定的少量不准确?
例如我有两种算法应该(理论上,具有无限精度)输出相同的数组。但是它们的工作方式不同,因此浮点错误的累积方式也不同,尽管数组长度应该完全相同。我想要一种快速简便的方法来测试数组是否相同。我当然可以成对比较数字,并报告最大误差;但是一种算法在 C++ 中,另一种在 Mathematica 中,我不希望将数字写入文件或将它们从一个系统粘贴到另一个系统。这就是为什么我想要一个简单的校验和。
我可以简单地将数组中的所有数字相加。如果数组长度为 N,并且我可以容忍每个数字中的错误为 0.0001,那么我会检查 abs(sum1-sum2)<0.0001*N。但是这种简单的“校验和”并不可靠,例如一个条目中的错误为+10,另一条目中的错误为-10。 (无论如何,概率论说错误可能会像 sqrt(N) 一样增长,而不是像 N。)当然,任何校验和都是数据块的低维摘要,因此它会错过 一些 错误,如果不是大多数的话……但简单的校验和对于查找非恶意错误类型的错误仍然很有用。
或者我可以创建一个二维校验和,[sum(x[n]), sum(abs(x[n]))]。但这是我能做的最好的吗,即我可能会使用与sum(x[n])“更正交”的不同功能吗?如果我使用了一些任意函数,例如[sum(f1(x[n])), sum(f2(x[n]))],那么我的“原始容错”应该如何转化为“校验和容错”?
我正在使用 C++ 编程,但我很高兴看到任何语言的答案。
【问题讨论】:
-
这不是校验和的目的。校验和用于确定位精确性,而不是用于容差测试。
-
有趣的问题。您是否考虑过傅里叶变换数据,可能与低通滤波结合使用?
-
@Oli:我的问题清楚地表明了我在寻找什么,我不知道我想要什么更好的词。如果您知道更好的词,请告诉我,我会改用它。目前,我已将单词校验和放在引号中。
-
我相信你所寻求的是不可能的,因为空间的维度是不同的。 (当您将 n 维空间映射到较小维空间时,您会“丢失信息”。)即使是一组整数的校验和也只能保证不同的校验和 => 不同的集合,反之亦然。 tlb 的建议可能与您在实践中得到的一样好。
-
我知道校验和会丢失信息。我已经编辑了问题以使其更清楚。尽管如此,校验和作为对愚蠢错误的第一次检查很有用,我想要具有相同属性的东西。
标签: testing encoding floating-point error-correction