sqrt Matlab和C ++的数值差异

时间:2015-05-27 15:05:33

标签: c++ matlab math precision scientific-computing

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

您建议使用哪种方法

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

    我添加了更多关于代码的精确度。

    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时,会出现显着的相对差异。

1 个答案:

答案 0 :(得分:0)

在计算中转换为C ++中的double可以解决差异问题。转换为双倍后,我们达到了非常令人满意的比赛。