Я наблюдаю численные различия между кодами Matlab и C ++. Расхождение, по-видимому, связано с разным выводом для метода sqrt в Matlab и C ++. Для очень маленьких номеров (< 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
его порядка 10е-6.
Преобразование в double в C ++ внутри вычислений решает проблему различий. Мы достигли очень удовлетворительного матча после преобразования в удвоение.