我见证了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时,会出现显着的相对差异。
答案 0 :(得分:0)
在计算中转换为C ++中的double可以解决差异问题。转换为双倍后,我们达到了非常令人满意的比赛。