1樓:「已登出」
浮點誤差
你把中間的比較改成這樣
i<=9.9 +0.01
i>0 + 0.01
i<9.9 - 0.01
這樣就沒有任何問題了
2樓:
除了浮點數判等誤差的原因之外,請思考下for的語義是什麼?
你今天吃了三頓飯,你會不會對人描述為:
第0.1頓: 早飯,油條豆漿
第0.2頓: 午飯,回鍋肉和公尺飯
第0.3頓: 晚飯,臊子面
這不符合人類計數的習慣。而for就是個迴圈計數器,蛋疼才會每次自增01.
3樓:
我認為這個問題跟浮點數運算過程中的截斷誤差是兩碼事,雖然這裡面的確出現了截斷誤差。
我們重新看一下程式:
#include
intmain()}
現在我們在腦海裡建立乙個運算過程:有乙個實數0,它每次增加0.1,最後增加到不大於9.9的乙個數為止。
接下來我們分析這個腦海中的過程與這段C++程式有什麼區別。
程式中出現了2個雙精度浮點值和1個整型值 。其中那個整型值是可以完美對映到實數0的。但是剩下的2個值卻不能對映到實數中的9.
9和0.1。原因是在C++中浮點數字面量是採用有限位的10進製表示的,但是字面量的值本身卻是有限位的2進製小數表示的。
雖然0.1這個實數在十進位制中表示作乙個有限小數,但是它在以二進位制表示時是乙個無限迴圈小數。9.
9以二進位制表示同樣是乙個無限迴圈小數。
現在我們把初值導致的差異分析完畢了,再看一下計算過程中會產生的截斷誤差。
先看雙精度浮點數0.1的二進位制表示是怎樣的:
我們可以看出,浮點數0.1加上浮點數0.1這個計算過程是不造成損失的,因為浮點數0.1的最後乙個有效位是0,因此有效位足夠儲存和數。我們把雙精度浮點數0.1稱為。
再看3個相加的結果,我們記它為:
可以看到與相加要做到和不損失需要54個有效位,而雙精度浮點數只提供了53個有效位(包括隱含的1),所以這裡就產生誤差了。
浮點數與實數的差異不小,需要正確理解浮點數才能將它用於數學計算。
4樓:yang leonier
你自己看看你用浮點數迴圈出來的彙編就會發現浮點數最好不要用於迴圈的控制
整數的迴圈控制很簡單,乙個inc 乙個cmp,乙個jz或者jnz足矣浮點就麻煩得多
5樓:Cryonyx
因為浮點數在記憶體中的表示問題
當i初始化為0時,i的真實值為0,所以以0.1為間隔自增,到9.9時再自增0.1,退出迴圈
但是當i被初始化為9.9時,i的值並不精確等於9.9,所以到了0.1的時候,自減仍舊大於0
6樓:李雨航
這不是for的問題,是計算機精度問題。數字在計算機中是以二進位制表示。如double a=0.
2;doubleb=0.1;你可以試著列印一下a+b,並不等於0.3;但是如果a=0.
15;b=0.15;a+b就等於0.3了
建議你看看《計算機組成原理》就明白了
7樓:阮之復興
浮點數在計算到最後一位的時候都會累積誤差,但是除非數值接近0,否則cout預設輸出都不會精確到那麼多。同樣的現象在excel裡面也可以實現
8樓:鍾宇騰
此問題與for無關,與浮點數的計算精度有關。
樓主你要記住一件事,浮點數是不能判相等的,比如你要判斷someVar的值是不是等於0,要這樣寫
abs(
someVar
-0.0
)<1e-6
someVar <= 9.9怎麼寫?
someVar
<9.9||
abs(
someVar
-9.9
)<1e-6
someVar
<9.9+
1e-6
如此類推
為什麼父母不支援穿Lolita?
SIVAN 不請自來 兩點第一 與自己審美不符合在父母眼裡女孩子要大方賢淑溫柔成熟穿lolita會顯得比較可愛有小孩子氣 第二認為花了一些不必要的錢買了一條自己不認為好看的裙子可能還有一點貴 御祁 瀉藥這題不會我爸媽支援而且幫助我一起選 任何關係都要互相理解互相包容包括親情 我媽覺得像女僕裝 而且布...
為什麼佛教不支援算命呢?
因為命可以改變,那麼只要修心就可以改變了。因為逆境順境都是可以相互轉化的,取決於人心。而算命者一般都是想著趨吉避凶,轉危為安,利用環境等外在條件 風水 等因素或自身行善等積極改變。這其實是很被動的,我們普通人做善事或者尋求改變安的是一顆功利心,大多數人心想,如果我沒有災厄要化,可能我就不需要行善積德...
為什麼男性這麼不支援彩禮?
為什麼你們所謂的這些對女性的風險一定要讓郭楠來買單?你以為結婚就只有彩禮嗎?房子車子婚禮家裡各類電器不要錢嗎?彩禮10萬對某些月光仙女來說,她5年不吃不喝都不一定有,看起來是不多。你不會以為結婚就只需要10萬彩禮吧?呵呵 為什麼不問老黑洋大人要?到了老黑洋大人就變真了?郭楠專屬彩禮?試問月薪3000...