在《演算法競賽入門經典(第二版)》(紫書)的第二章,最後有一道思考題:
#includeint main()
實驗發現程式會無限迴圈執行下去,即使把10換成10.0也沒有用。
這就是程式的浮點數陷阱。
我們知道,計算機底層儲存資料是二進位制的。如果學過計組的同學會知道,整數計算還好,小數計算會由於精度問題出現捨入,導致計算結果與真實值出現細微偏差。
也就是說,1.1 + 0.1並不一定會按照我們預想的得到1.2,也有可能會得到0.120……01。
因此我們不應該依靠==對浮點數進行恒等判斷。
總結:迴圈的條件變數應當是整形的。事實上它也沒有理由應該是其他型別的,難道我們要迴圈0.5次嗎?
在判斷兩個浮點數a和b是否相等時,不要用a==b。作為替代,可以計算兩者之差的絕對值fabs(a-b)
是否小於某個閾值,例如if(fabs(a-b) < 1e-9)
。
浮點數陷阱
剛在 演算法競賽 入門經典 中看到的,乙個浮點數陷阱,覺得蠻有意思的,所以發上來和大家分享一下。下面 執行的結果是什麼?includeint main 或許你會覺得輸出肯定是從0.0開始一直到10.0結束對吧。不過你上機執行一下就會發現,輸出陷入了死迴圈一樣,會一直不停的輸出。原因是,程式中的i永遠...
浮點數陷阱
在書上看到這樣的乙個程式 includeint main return 0 第一反應是乙個簡單的for迴圈,i每次增加0.1如何輸出,一直到i 10,迴圈結束。執行之後 程式進入死迴圈,說明 for i 0 i 10 i 0.1 中i 10終止條件沒有起作用,在for迴圈中加入兩條語句觀察i的值 f...
浮點數陷阱
陷阱1 cpp view plain copy print double i for i 0 i 10 i 0.1 printf 1lf n i double i for i 0 i 10 i 0.1 printf 1lf n i 程式會列印至10.0時結束迴圈嗎?不會。因為i永遠也不可能等於10,...