sqrt Matlab与C++数值差异

sqrt Matlab and C++ numerical differences

我见证了 Matlab 和 C++ 代码之间的数值差异。差异似乎源于 Matlab 和 C++ 中 sqrt 方法的不同输出。对于非常小的数字(< 10-5),相对差异似乎相当大。

您建议采用哪种方法

  1. 确保差异来自 sqrt
  2. 调整 cpp 代码以复制浮点精度的 Matlab 代码

编辑

我增加了代码的准确性。

float* buttonVar = new float[nBut];


for (int_T ibut = 0; ibut < nBut; ibut++)
{
    for (int_T id = start_idx; id <= stop_idx; id++)
    {
        inputArray[id - start_idx] = arr[ibut * nDepth + id];
    }
    reduceVector(inputArray, reducedArray, inputarray_size, d1, d2);

    buttonMean[ibut] = 0;
    buttonVar[ibut] = 0;
    for (int_T id = 0; id < min(nd, nDepth); id++)
    {
        buttonMean[ibut] += reducedArray[id] / float(nd);
    }
    for (int_T id = 0; id < min(nd, nDepth); id++)
    {
        buttonVar[ibut] += (reducedArray[id] - buttonMean[ibut])
                                        *(reducedArray[id] - buttonMean[ibut]);
    }


    buttonVar[ibut] = sqrtf(buttonVar[ibut] / float(nd));
}

在 Matlab 中,我将 single 数字转换为 sqrt。代码中的差异出现在 buttonVar 中。

在 Google 测试中比较的最终结果是更多操作的结果,没有调用其他数学函数。这些额外的操作是在经过彻底 Google 测试的方法中进行的,并且与这些测试的输出浮点精度完美匹配。

buttonVar 中的数值差异高达 15% 的相对差异 (=100*abs(cpp_res - matlab_res)/matlab_res。显着的相对差异发生在buttonVar 他的数量级为 10e-6。

在计算内部转换为C++中的double解决了差异问题。转换为 double 后,我们达到了非常令人满意的匹配。