0
下列Matlab的命令(MATLAB版本:8.2.0.701(R2013b))時Matlab的精度使用範數
format long;
norm([9, 2])
給出
9.219544457292889
其中如,
sqrt(9^2+2^2)
給出
9.219544457292887
注意最後一個小數位。這臺機器是否依賴?爲什麼會發生?我怎樣才能避免它?
下列Matlab的命令(MATLAB版本:8.2.0.701(R2013b))時Matlab的精度使用範數
format long;
norm([9, 2])
給出
9.219544457292889
其中如,
sqrt(9^2+2^2)
給出
9.219544457292887
注意最後一個小數位。這臺機器是否依賴?爲什麼會發生?我怎樣才能避免它?
這是一個很好的指導如何compare floating point numbers。由於幾個原因(錯誤積累,不同算法,機器精度等),當應用理論(手工完成)必須返回相同數字(歡迎使用科學計算!)的兩種不同算法時,您可能會得到稍微不同的答案。
如果一個使用betweeen兩個結果相對比較(假設規範的結果是正確的),您將獲得:
abs(9.219544457292889 - 9.219544457292887)/9.219544457292889 = 1.9267e-016
這是微不足道的。出於任何實際目的,你都會得到完全相同的結果。
如果你想獲得確切的答案,你必須使用Arbitrary-precision庫(@Divakar在評論部分提到),但是你會付出更高CPU使用的代價。
在我的電腦上(Matlab R2010b)它給出了第二個結果(以7結尾)。也許試試'hypot(9,2)'。無論如何,你爲什麼要避免它?這是通常的數值精度問題,並且它的精確度很高 – 2014-11-03 11:45:44
如果你有支持'vpa'的工具箱,你可以使用它來獲得更精確的結果,但是採用字符串格式。 'vpa(sqrt(9^2 + 2^2))'產量 - '9.2195444572928873100022742817628'。 'vpa(norm([9,2]))'產生相同的結果,即'9.2195444572928873100022742817628' – Divakar 2014-11-03 11:46:51
'hypot(9,2)'給了我第二個結果。但我不能使用它,因爲我想要更高維度的平方和。 – Prometheus 2014-11-03 11:49:32