Testing 如何';校验和';一个有噪声的浮点数数组?

Testing 如何';校验和';一个有噪声的浮点数数组?,testing,encoding,floating-point,error-correction,Testing,Encoding,Floating Point,Error Correction,什么是一种快速简便的方法来对浮点数数组进行校验和,同时允许指定的少量误差 e、 我有两个算法(理论上,具有无限精度)可以输出相同的数组。但是它们的工作方式不同,因此浮点错误的累积方式也不同,尽管数组长度应该完全相同。我想要一个快速简单的方法来测试数组是否相同。当然,我可以两两比较数字,并报告最大误差;但一个算法是C++,另一个是Mathematica,我不想麻烦把这些数字写入文件或者粘贴它们从一个系统到另一个系统。这就是为什么我想要一个简单的校验和 我可以简单地将数组中的所有数字相加。如果数组长

什么是一种快速简便的方法来对浮点数数组进行校验和,同时允许指定的少量误差

e、 我有两个算法(理论上,具有无限精度)可以输出相同的数组。但是它们的工作方式不同,因此浮点错误的累积方式也不同,尽管数组长度应该完全相同。我想要一个快速简单的方法来测试数组是否相同。当然,我可以两两比较数字,并报告最大误差;但一个算法是C++,另一个是Mathematica,我不想麻烦把这些数字写入文件或者粘贴它们从一个系统到另一个系统。这就是为什么我想要一个简单的校验和

我可以简单地将数组中的所有数字相加。如果数组长度为N,并且我可以容忍每个数字中0.0001的错误,那么我将检查
abs(sum1-sum2)是否尝试以下操作:

#include <complex>
#include <cmath>
#include <iostream>

// PARAMETERS
const size_t no_freqs = 3;
const double freqs[no_freqs] = {0.05, 0.16, 0.39}; // (for example)

int main() {
    std::complex<double> spectral_amplitude[no_freqs];
    for (size_t i = 0; i < no_freqs; ++i) spectral_amplitude[i] = 0.0;
    size_t n_data = 0;
    {
        std::complex<double> datum;
        while (std::cin >> datum) {
            for (size_t i = 0; i < no_freqs; ++i) {
                spectral_amplitude[i] += datum * std::exp(
                    std::complex<double>(0.0, 1.0) * freqs[i] * double(n_data)
                );
            }
            ++n_data;
        }
    }
    std::cout << "Fuzzy checksum:\n";
    for (size_t i = 0; i < no_freqs; ++i) {
        std::cout << real(spectral_amplitude[i]) << "\n";
        std::cout << imag(spectral_amplitude[i]) << "\n";
    }
    std::cout << "\n";
    return 0;
}
#包括
#包括
#包括
//参数
const size\u t no\u freqs=3;
常数双频[无频率]={0.05,0.16,0.39};//(例如)
int main(){
std::复频谱振幅[无频率];
对于(尺寸i=0;i<无频率;++i)频谱振幅[i]=0.0;
大小n数据=0;
{
复杂数据;
而(标准::cin>>基准){
对于(大小i=0;i我有一种感觉,你想要的可能是通过这样的方式实现的。如果你能将你的值转换成格雷码,并使用某种能够纠正n位的校验和,你就可以检测两个数组是否相同,除了n-1位的错误,对吗?(每一位错误意味着一个数字是“关一”的),其中映射将是最低有效位的变化)

但具体细节我无法理解,尤其是浮点值

我不知道这是否有帮助,但灰色代码解决的是病理性舍入的问题。舍入听起来似乎可以解决问题-一个简单的解决方案可能会舍入,然后校验和。但简单的舍入总是有病理性的情况-例如,如果我们使用floor,那么0.9999999和1是不同的。灰色代码方法似乎可以解决问题也就是说,由于相邻的值总是一位距离,所以基于位的校验和将准确地反映“距离”

[更新:]更准确地说,您需要的是一个校验和,它可以估计灰色编码序列之间的距离(如果您只关心0.0001,灰色编码部分很容易,因为您可以将所有内容乘以10000并使用整数)

它看起来像是这样的校验和:任何纠错码都可以用于错误检测。一个最小汉明距离d的码可以检测多达d的错误− 1码字中的错误。如果需要严格限制要检测的最小错误数,则使用基于最小距离的纠错码进行错误检测是合适的

所以,以防不清楚:

  • 乘以最小错误以获得整数
  • 转换为等效的格雷码
  • 使用最小汉明距离大于您可以容忍的错误的错误检测代码
但我仍然不确定这是否正确。在从浮点到整数的转换过程中,仍然会得到病理性的舍入。因此,似乎需要1+len(data)的最小汉明距离(最坏情况下,每个值都有舍入误差)。这可行吗?可能不适用于大型阵列


也许再问一次更好的标签/描述,现在有了一个大致的方向?或者现在就添加标签?我们需要一个以此为生的人。[我添加了几个标签]

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

我很确定没有基于“以某种巧妙的方式离散化,然后应用离散校验和”的解决方案,例如,“离散化为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的数量是固定的,它是数组的大小不会线性增长,因此它满足了我对“低维摘要”的需求。此方法还可以估计误差的标准偏差,这可能很方便。

对通过将数据的最低有效位归零而获得的数据计算一个标准整数校验和怎么样?这些数字是您不关心的?

这不是校验和的目的。校验和用于确定位精度,不适用于公差测试。有趣的问题。你有没有想过对数据进行傅里叶变换,可能与低通滤波结合使用?@Oli:我的问题清楚地表明了我在寻找什么,我不知道有什么更好的词来表达我的要求。如果你知道一个更好的词,请告诉我,我会用它来代替。现在,我已经把“切”这个词放在这里了我相信你所寻求的是不可能的,因为spac的维度