浮点数陷阱

 

  陷阱一

 

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,则不会无限循环下去。计算机

相关文章
相关标签/搜索