sqrt Matlab与C++数值差异
sqrt Matlab and C++ numerical differences
我见证了 Matlab 和 C++ 代码之间的数值差异。差异似乎源于 Matlab 和 C++ 中 sqrt 方法的不同输出。对于非常小的数字(< 10-5),相对差异似乎相当大。
您建议采用哪种方法
- 确保差异来自 sqrt
- 调整 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 后,我们达到了非常令人满意的匹配。
我见证了 Matlab 和 C++ 代码之间的数值差异。差异似乎源于 Matlab 和 C++ 中 sqrt 方法的不同输出。对于非常小的数字(< 10-5),相对差异似乎相当大。
您建议采用哪种方法
- 确保差异来自 sqrt
- 调整 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 后,我们达到了非常令人满意的匹配。