2014-11-03 54 views
0

下列Matlab的命令(MATLAB版本:8.2.0.701(R2013b))時Matlab的精度使用範數

format long; 
norm([9, 2]) 

給出

9.219544457292889 

其中如,

sqrt(9^2+2^2) 

給出

9.219544457292887 

注意最後一個小數位。這臺機器是否依賴?爲什麼會發生?我怎樣才能避免它?

+3

在我的電腦上(Matlab R2010b)它給出了第二個結果(以7結尾)。也許試試'hypot(9,2)'。無論如何,你爲什麼要避免它?這是通常的數值精度問題,並且它的精確度很高 – 2014-11-03 11:45:44

+1

如果你有支持'vpa'的工具箱,你可以使用它來獲得更精確的結果,但是採用字符串格式。 'vpa(sqrt(9^2 + 2^2))'產量 - '9.2195444572928873100022742817628'。 'vpa(norm([9,2]))'產生相同的結果,即'9.2195444572928873100022742817628' – Divakar 2014-11-03 11:46:51

+0

'hypot(9,2)'給了我第二個結果。但我不能使用它,因爲我想要更高維度的平方和。 – Prometheus 2014-11-03 11:49:32

回答

1

這是一個很好的指導如何compare floating point numbers。由於幾個原因(錯誤積累,不同算法,機器精度等),當應用理論(手工完成)必須返回相同數字(歡迎使用科學計算!)的兩種不同算法時,您可能會得到稍微不同的答案。

如果一個使用betweeen兩個結果相對比較(假設規範的結果是正確的),您將獲得:

abs(9.219544457292889 - 9.219544457292887)/9.219544457292889 = 1.9267e-016 

這是微不足道的。出於任何實際目的,你都會得到完全相同的結果。

如果你想獲得確切的答案,你必須使用Arbitrary-precision庫(@Divakar在評論部分提到),但是你會付出更高CPU使用的代價。