2012-02-16 124 views
2

您好我正在使用armadillo庫重寫一個腳本從MATLAB到C++用於線性代數和矩陣。matlab和C++精度

用於獲得或多或少相同的輸出I稱爲COUT方法:

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 

犰狳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++的一些錯誤引起的代碼轉換或它們應該被認爲是G雙精度之間的正常差異++和MATLAB

在我的代碼我使用了很多週期是這樣的:

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

其中xi_summedtransalphabarma::mat%是逐個元素的乘法和mat::t()被調換和規範的功能,使的條目米atrix A數組總和爲1

+1

對我來說,這看起來不像正常的差異。 – WeaselFox 2012-02-16 12:56:07

+0

請給我們一些代碼。 – 2012-02-16 12:59:11

+0

我想重寫HMM工具包的一些功能,並且有超過500行C++代碼。我不知道什麼行後,因爲我不知道錯誤應該在哪裏 – nkint 2012-02-16 13:01:22

回答

3

這當然不是一個正常的區別!

機器epsilon的數量級要小於所得到的錯誤數(即2.22e-016 vs. 2.0e-3)。

可以確認你的機器小量用下面的C++代碼:

#include <limits> 

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

您的MATLAB腳本將被綁定到相同的限制;可以通過輸入確認此以下到Matlab命令窗口:

eps 

如果正在執行在Matlab和C++的計算是數學上等效,那麼你應該獲得同樣的結果 - 尤其是4 D.P.精確!

2

通常精度要好得多,你可以輸入eps找出matlab的精度。對我而言,這是2.2204e-16

但是,它也高度依賴於你正在做的微積分。例如,如果您計算兩個非常大的數字的差異,並且差異非常小,那麼您的精度將會非常差。

確實,eps是一個相對精度。 因此,如果您輸入eps(n),您將具有給定值的精度。

例如,eps(10^16)2。因此對於數字大於10^16的操作,精度將爲2

+0

以及如何檢查C++中的精度設置相同? – nkint 2012-02-16 13:04:39

+0

在C++中。雙變量是64位,所以精度應該在'2^-64 = 5e-20'左右。同樣,float應該有'2^-32 = 2e-10'精度 – Oli 2012-02-16 13:13:38

+0

所以如果我想讓matlab具有相同的C++精度,我必須編寫eps(5e-20)。 但我的不同結果呢?因爲你是由不同的精度造成的,或者錯誤是在別的地方? – nkint 2012-02-16 13:16:40