我见证了Matlab和C++代码之间的数值差异。在Matlab和C++中,sqrt方法的不同输出似乎是造成差异的原因。对于非常小的数字(< 10-5),似乎相对差异很大。
你会建议采取哪种方法
编辑
我增加了关于代码的更精确性。
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量级时,存在显著的相对差异.
发布于 2015-05-28 14:18:03
在计算中转换为双C++解决了差分问题。在转换成双打之后,我们达到了一场非常满意的比赛。
https://stackoverflow.com/questions/30486331
复制相似问题