如何“校验和”一个嘈杂的浮点数数组?

Dam*_*nJW 5 testing floating-point encoding error-correction

在允许指定的少量误差的同时,“校验和”浮点数数组的快速简便方法是什么?

例如,我有两种算法(理论上应该无限精确)应该输出相同的数组。但是它们的工作方式不同,因此尽管数组长度应该完全相同,但浮点错误的累积方式也会不同。我想要一种快速简便的方法来测试数组是否相同。我当然可以成对比较数字,并报告最大错误;但是一种算法是用C ++编写的,另一种算法是用Mathematica编写的,我不希望将数字写到文件中或将它们从一个系统粘贴到另一个系统中。这就是为什么我想要一个简单的校验和。

我可以简单地将数组中的所有数字相加。如果数组长度为N,并且每个数字我都可以容忍0.0001的错误,那么我将检查是否abs(sum1-sum2)<0.0001*N。但是这种简单的“校验和”并不可靠,例如,在一项中错误为+10,在另一项错误为-10。(无论如何,概率论认为错误可能像sqrt(N)一样增长,而不是像N一样。)当然,任何校验和都是数据块的低维摘要,因此,即使不是大多数,它也会丢失一些错误。 ..但简单的校验和对于查找非恶意的bug类型错误很有用。

或者,我可以创建一个二维校验和[sum(x[n]), sum(abs(x[n]))]。但是,这是我所能做的最好的事情,即我是否可以使用一个与“更正交”的函数sum(x[n])?如果我使用了一些任意函数,例如[sum(f1(x[n])), sum(f2(x[n]))],那么我的“原始错误容忍度”应如何转换为“校验和错误容忍度”?

我使用C ++进行编程,但是很高兴看到任何语言的答案。

Dam*_*nJW 3

我花了一段时间寻找确定性的答案,但未能找到。如果有一个好的答案,可能需要大量的数学技能(泛函分析)。

我很确定没有基于“以某种狡猾的方式离散化,然后应用离散校验和”的解决方案,例如“离散化为 0/1/? 的字符串,其中 ? 表示通配符”。任何离散化都具有这样的特性:两个非常接近的浮点数最终可能会得到不同的离散代码,然后离散校验和不会告诉我们我们想知道的内容。

然而,一个非常简单的随机方案应该可以正常工作。从字母表 {+1,-1} 生成伪随机字符串 S,并计算 csx=sum(X_i*S_i) 和 csy=sum(Y_i*S_i),其中 X 和 Y 是我的原始浮点数数组。如果我们将误差建模为均值为 0 的独立正态随机变量,则很容易计算 csx-csy 的分布。我们可以对几个字符串 S 执行此操作,然后进行平均误差为 0 的假设检验。测试所需的字符串 S 的数量是固定的,它不会随数组大小线性增长,因此满足我需要一个“低维摘要”。该方法还给出了误差标准差的估计,这可能很方便。