浮點數陷阱

2022-09-02 07:15:07 字數 1090 閱讀 2533

陷阱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,這是個無限迴圈

陷阱2

[cpp]view plain

copy

print?if

(0.1+0.1+0.1 == 0.3)  

printf(

"equal\n"

);  

else

printf(

"not equal\n"

);  

if(0.1+0.1+0.1 == 0.3)

printf("equal\n");

else

printf("not equal\n");

會輸出"equal"嗎?不會。實際浮點數運算時,0.1+0.1+0.1 != 0.3

產生上述陷阱的原因

實際上,計算機中的所有資料都用二進位制表示,包括浮點數。這就導致某些浮點數不能用二進位制精確表示,例如0.1(這很容易理解,就像10/3不能被十進位制精確表示一樣)

進一步地說,浮點數是採用分數+指數來表示的,例如

0.5 = 1/2

0.75 = 1/2 + 1/(2^2)

0.875 = 1/2 + 1/(2^2) + 1/(2^3)

0.1 = 1/(2^4) + 1/(2^5) + 1/(2^8) + ...

其中0.1只能無限迴圈下去,這就意味著0.1在計算機中不能被精確表示,因此產生上述兩個陷阱也就很容易理解

浮點數陷阱

剛在 演算法競賽 入門經典 中看到的,乙個浮點數陷阱,覺得蠻有意思的,所以發上來和大家分享一下。下面 執行的結果是什麼?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...

浮點數運算的陷阱

浮點數的運算不能說是精確的,因為某些數字不能準確表示為二進位制 例如 0.1 以下是乙個用浮點數運算的例子,例子證明了我們應該慎用浮點數運算。author crane.ding public class test 執行結果如下 0.70000005 false 0.7000000238418579 ...