标题:浮点数比较(一直没解决,心里好难受)
只看楼主
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
结帖率:98.68%
已结贴  问题点数:50 回复次数:6 
浮点数比较(一直没解决,心里好难受)
下面的程序为什么输入0.000001会显示不相等,虽然我知道浮点数比较大小会有很多问题,但0.000001应该在内存中能精确存储啊
请哪位朋友帮解释一下,请从内部存储方式来讲下面的程序为什么会执行出这样的结果
以下是在下的认识:
在IEEE标准中.浮点以23位表示小数,这样的精确度应为0.00000000000000000000001(二进制),共22个0,换算为十进制大约为
0.000000119(十成制),6个0. 以此判断,十进制转为二进制的精确度只能保证在0.000001,5个零,那我输入0.000001应该能精确存储,怎么还会出现下面的问题呢??
#include"stdio.h"
main()
{
    float i;
    scanf("%f",&i);
   
    if(i == 0.000001)
        printf("It's equate to 0.000001");
    else
        printf("It's not equate to 0.000001");
}
搜索更多相关主题的帖子: 点数 
2009-09-03 20:26
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
得分:20 
i==0.000001之所以不等不是精确度不到,是比较时两数类型不匹配。
我们知道浮点型是4字节,用sizeof(i)=4,而sizeof(0.000001)则等于8,是双精度占用内存的字节数,
如把if(i==0.000001)改成if(i==(float)0.000001)判断就为真,
下面是个测试代码:
main()  
{  
 float i;  
 double k;  
 k=0.000001;  
 i=0.000001;  
 
 if(i==0.000001)
    printf("yes sizeof(0.000001)=%d,sizeof(i)=%d\n",sizeof(0.000001),sizeof(i));
 else printf("no sizeof(0.000001)=%d,sizeof(i)=%d\n",sizeof(0.000001),sizeof(i));
 
 if(i==k)
    printf("yes sizeof(k)=%d,sizeof(i)=%d\n",sizeof(k),sizeof(i));
 else
    printf("no sizeof(k)=%d,sizeof(i)=%d\n",sizeof(k),sizeof(i));
 
 if(i==(float)0.000001)
    printf("yes sizeof(0.000001)=%d,sizeof(i)=%d\n",sizeof((float)0.000001),sizeof(i));
 else
    printf("no sizeof(0.000001)=%d,sizeof(i)=%d\n",sizeof((float)0.000001),sizeof(i));
 
  printf("\n\n");
    getch();
}
·
结果是第三条if判断语句为真,第一、二条为假。

努力—前进—变老—退休—入土
2009-09-03 21:30
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:30 
因为浮点常量是double类型
所以在==运算符起作用之前会先对float型变量i进行扩展变成double格式,补了一些二进制位的0
而由于0.000001并不是(有限个数的)2的负整数次幂(之和),所以对应上面补上的那些位置原本会有一些1
也就是不相等了
float i=0.000001扩展为double后的二进制形式为
0011111010110000110001101111011110100000000000000000000000000000
而天生的double x=0.000001的二进制形式为
0011111010110000110001101111011110100000101101011110110110001101
很一目了然吧?

[ 本帖最后由 forever74 于 2009-9-3 21:52 编辑 ]

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2009-09-03 21:42
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
得分:0 
回复 2楼 UserYuH
请问下

[ 本帖最后由 jingzitakk66 于 2009-9-3 21:47 编辑 ]
2009-09-03 21:45
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
得分:0 
回复 3楼 forever74
非常感谢,非常清楚,
再请教一个问题,令我更加困惑的,呵呵
判断一个浮点数与零是否相等为什么要用if(i>-0.000001&&i<0.000001)而不用if(i == 0) ???
能举一个用if(i == 0)会出现问题的例子吗?
2009-09-03 22:08
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
如果是判断之前i是刚刚赋值或者输入的0,那就可以写if(i==0),可是这样貌似没啥意思,属于自己不相信自己
实际程序中那个i往往是前面经过复杂计算得到的结果,由于一些误差的积累,可能产生很小的零头,于是就得象你前面那样写了
例如
float x1=0.42,x2=2.,x3=0.01,x4=x1/x2-x3-x2/10;
这个x4应该是0吧?可它偏偏就是
10110001110110011001100110011010
好多1呢

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2009-09-03 22:30
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
得分:0 
回复 6楼 forever74
谢谢,明白了,浮点运算真麻烦,幸好我搞嵌入式,呵呵
2009-09-03 22:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-284707-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.285754 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved