運行了一段matlab的代碼(見下圖),但結果讓我百思不得其姐,有哪位大神能給我解答一下嗎?
m==0.3,這個邏輯判斷為什麼結果是0啊?m明明是等於0.3的呀。何況上面判斷等於0.2的時候也沒問題呀。是我的matlab軟體出問題了還是有什麼問題我沒看出來呀。
樓上解釋的都贊同,補充幾點:
1. m 每次的增量看似是0.1,其實是一個非常接近0.1的數,所以多次累加之後,誤差就累加了。Doug Hull給出過下面一個例子,其中b會出現類似你的例子中的m的問題。
a=[0 0.1 0.2 0.3 0.4];
b=[0:.1:.4];
as=sprintf("%20.18f
",a)
as =
0.000000000000000000 % ==
0.100000000000000010 % ==
0.200000000000000010 % ==
0.299999999999999990 % ~= bs !
0.400000000000000020 % ==
bs=sprintf("%20.18f
",b)
bs =
0.000000000000000000 % ==
0.100000000000000010 % ==
0.200000000000000010 % ==
0.300000000000000040 % ~= as !
0.400000000000000020 % ==
% -and-
format hex;
hd=[a.",b."]
hd =
0000000000000000 0000000000000000 % ==
3fb999999999999a 3fb999999999999a % ==
3fc999999999999a 3fc999999999999a % ==
3fd3333333333333 3fd3333333333334 % ~= !
3fd999999999999a 3fd999999999999a % ==
Why does 1 - 2/3
2. 所以,對於浮點數採用 == 的時候要特別注意。像 Allen Zhu 所提到的,可以用比較」軟「的方式來判斷是否相等,除了用一個固定的閾值
abs(m-0.3) &< 1e-6
我覺得更好的辦法是用一個相對的誤差eps(m), 即
abs(m - 0.3) &<= eps(m)
3 這個問題不是MATLAB特有的,請參考
- Cleve Moler, 「Floating points" http://www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve.pdf- 「What Every Computer Scientist Should Know About Floating-Point Arithmetic」
What Every Computer Scientist Should Know About Floating-Point Arithmetic判斷變數是否等於某值,建議採用下面略顯繁瑣的方式:if abs(m-0.3) &< 1e-6% your code
end
舍入誤差。
參考為什麼說浮點數缺乏精確性? python中浮點數運算問題 - Python
推薦閱讀:
※大家用matlab的時候,都去哪裡下載程序啊?
※MATLAB 繪製多條曲線 顏色設置有沒有比較簡便的方法 ?
※Matlab在金融領域有什麼具體應用嗎?
※matlab把日期轉換成數字以後輸出到csv文件,數字會四捨五入?
TAG:MATLAB |