首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sqrt与C++数值差分

sqrt与C++数值差分
EN

Stack Overflow用户
提问于 2015-05-27 15:05:32
回答 1查看 396关注 0票数 0

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

你会建议采取哪种方法

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

编辑

我增加了关于代码的更精确性。

代码语言:javascript
运行
复制
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量级时,存在显著的相对差异.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-28 14:18:03

在计算中转换为双C++解决了差分问题。在转换成双打之后,我们达到了一场非常满意的比赛。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30486331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档