程式設計陷阱 浮點數捨入

2021-09-01 20:22:55 字數 571 閱讀 4571

在《演算法競賽入門經典(第二版)》(紫書)的第二章,最後有一道思考題:

#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,...