2012-02-16 20 views
2

Привет Я переписываю скрипт из MATLAB в C++, используя armadillo библиотеку для линейной алгебры и матрицы.matlab и C++ precision

для получения более или менее тот же результат, я назвал соиЬ метод:

cout.precision(4); 
cout.setf(ios::fixed); 

, но я получаю различный результат:

Matlab результат:

0.0000 0.0000 0.0000 0.0000 0.0000 
0.0012 0.0014 0.0016 0.0020 0.0281 
0.0396 0.0297 0.0297 0.0495 0.0976 

Armadillo C++ результат:

0.0000 0.0000 0.0000 0.0000 0.0000 
0.0012 0.0014 0.0016 0.0020 0.0282 
0.0416 0.0312 0.0312 0.0520 0.1027 

сейчас, я не знаю, если thoose мало неточностей (0.039 находится рядом с 0.041) вызваны некоторыми ошибками в моем C++ кода или перевод их следует рассматривать как нормальные различия между двойной точностью в г ++ и MATLAB

В моем коде Я использую много цикла, как это:

xi_summed = xi_summed + normalise((trans % (alpha.col(t) * b.t()))); 

где xi_summed, trans, alpha, b являются arma::mat и % является поэлементно умножением и mat::t() является транспонировать и нормализуют являются функциями, которые делают записи о м atrix A Сумма массива до 1.

+1

определенно не выглядит нормальным для меня. – WeaselFox

+0

Покажите нам, пожалуйста, код. –

+0

Я tring, чтобы переписать некоторую функцию инструментария HMM, и есть более 500 строк кода C++. я не знаю, что сообщение строки, потому что я не знаю, где ошибка должна быть – nkint

ответ

3

Это, безусловно, не нормальная разница!

Эпилон машины будет на порядок меньше ошибок, которые вы получаете (например, 2.22e-016 против 2.0e-3).

Вы можете подтвердить вашу машину эпсилон со следующим кодом C++:

#include <limits> 

cout << "Machine Epsilon is: " << numeric_limits<double>::epsilon() << endl; 

Ваш сценарий Matlab будет связан с теми же ограничениями; Вы можете подтвердить это, введя следующую команду в командном окне Matlab:

eps 

Если вычисления вы выполняете в Matlab и C++ являются математически эквивалентны, то вы должны получить тот же результат - особенно с 4 Д.П. точность!

2

Обычно точность намного лучше, вы можете узнать точность Matlab, набрав eps. Для меня это 2.2204e-16.

Однако он также сильно зависит от исчисления, которое вы делаете.

Например, если вы вычисляете разницу двух очень больших чисел, а разница очень мала, ваша точность будет очень плохой.

Действительно, eps - относительная точность. Итак, если вы наберете eps(n), у вас будет точность для данного значения.

Например, eps(10^16) является 2. Таким образом, для операций с числами 10^16 точность будет 2.

+0

и как я могу проверить точность в C++ для того же? – nkint

+0

В C++. двойные переменные 64 бит, поэтому точность должна быть около '2^-64 = 5e-20'. Точно так же float должен иметь точность ~ 2^-32 = 2e-10' – Oli

+0

, поэтому, если я хочу, чтобы matlab с такой же точностью C++, я должен написать eps (5e-20). но как насчет моего другого результата? потому что вы вызваны другой точностью или ошибка где-то в другом месте? – nkint