численные различия в sqrt Matlab и C ++

Я наблюдаю численные различия между кодами Matlab и C ++. Расхождение, по-видимому, связано с разным выводом для метода sqrt в Matlab и C ++. Для очень маленьких номеров (< 10-5) кажется, что относительная разница довольно большая.

Какой подход вы бы предложили

  1. убедитесь, что различия происходят от sqrt
  2. настроить код 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 его порядка 10е-6.

0

Решение

Преобразование в double в C ++ внутри вычислений решает проблему различий. Мы достигли очень удовлетворительного матча после преобразования в удвоение.

0

Другие решения


По вопросам рекламы [email protected]