浮點數陷阱

《浮點數陷阱》——by @zhengxu001

以下爲複製粘貼過來的文章內容:

陷阱1

[cpp] view plaincopyprint?

  1. double i;  

  2. for(i = 0; i != 10; i += 0.1)  

  3.     printf("%.1lf\n", i);  

程序會打印至10.0時結束循環嗎?不會。因爲i永遠也不可能等於10,這是個無限循環


陷阱2

[cpp] view plaincopyprint?

  1. if(0.1+0.1+0.1 == 0.3)  

  2.     printf("equal\n");  

  3. else  

  4.     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在計算機中不能被精確表示,因此產生上述兩個陷阱也就很容易理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章