標籤:

運行了一段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 |