浮點數陷阱

 

  陷阱一

 

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.3spa

 

   陷阱二

 

double i;
for(i=0;i!=10;i+=0.1)
    printf("%.1lf\n",i);

 

  程序會從0.0打印至9.9時結束循環嗎?不會!由於i永遠也不可能等於10,這個會無限循環code

 

  產生上述陷阱的緣由

 

  計算機中的全部數據都使用二進制表示的,包括浮點數,這就致使某些浮點數不能用二進制精確表示,例如0.1(這很容易理解,就像10/3=0.33333……不能被十進制精確表示同樣)blog

  例如:class

    (0.5)10 = 2-1 = (0.1)2循環

    (0.75)10 = 2-1 + 2-2 = (0.11)2二進制

    (0.875)10 = 2-1 + 2-2 + 2-3 = (0.111)2程序

    (0.1)10 = 2-4 + 2-5 + 2-8 + …… = (0.00011001……)2數據

  其中0.1只能無限循環下去,這就意味着0.1在計算機中不能被精確表示,所以產生上述兩個陷阱也就很容易理解,它們都涉及了不能用二進制精確表示的0.1參與運算,因此得不到預期的結果。例如陷阱二,把步長改成能夠用二進制精確表示的0.5,則不會無限循環下去。計算機

相關文章
相關標籤/搜索