当前位置: 代码迷 >> C语言 >> [讨论]关于float的问题?谁能仔细讲解一下?
  详细解决方案

[讨论]关于float的问题?谁能仔细讲解一下?

热度:229   发布时间:2006-05-05 14:53:00.0
[讨论]关于float的问题?谁能仔细讲解一下?
昨天在QQ群里和人讨论问题时有人给出了一个例子,现在我还没搞明白,希望哪位大侠来讲解一下,最好从原理上来讲。
例:{
float a=2.4;
if(a==2.4) printf("OK\n");
else printf("ERROR\n");
}
按说这个程序应该输出OK的,但不知道为什么输出的却是ERROE,用if(a>=2.4&&a<=2.4)也不行,除非用if(a==2.4f),但其他的类型比如double就不用这样,谁能给咱详细讲一下,小弟实在是很迷茫?
搜索更多相关的解决方案: float  讲解  

----------------解决方案--------------------------------------------------------
以下是引用peiyq401在2006-5-5 14:53:00的发言:
昨天在QQ群里和人讨论问题时有人给出了一个例子,现在我还没搞明白,希望哪位大侠来讲解一下,最好从原理上来讲。
例:{
float a=2.4;
if(a==2.4) printf("OK\n");
else printf("ERROR\n");
}
按说这个程序应该输出OK的,但不知道为什么输出的却是ERROE,用if(a>=2.4&&a<=2.4)也不行,除非用if(a==2.4f),但其他的类型比如double就不用这样,谁能给咱详细讲一下,小弟实在是很迷茫?

因为2.4无法的小数部分0.4=2/5,只有在5进制或5的倍数进制(如10进制)里,0.4才能精确地表示出来.然而计算机的float是存储二进制"尾数"的,因此只能找一个特别接近0.4的二进制小数表示它(实际情况还要复杂一些)总之,二进制表示0.1,0.2,0.3,0.4都不准确,0.5,0.25,0.75,0.125等则反而是准确的,就这么奇怪.


----------------解决方案--------------------------------------------------------
哦,好象有点明白了,可是为什么double类型的就能准确表达呢?这时0.1,0.2之类的数据是准确的吗?
----------------解决方案--------------------------------------------------------

这应该是因为,2.4 是默认为double类型的,你在弄表达式a==2.4时是float 与 double 混用,会出现问题,改成a==(float )2.4就可以了.


----------------解决方案--------------------------------------------------------
以下是引用andyss在2006-5-5 15:12:00的发言:

这应该是因为,2.4 是默认为double类型的,你在弄表达式a==2.4时是float 与 double 混用,会出现问题,改成a==(float )2.4就可以了.

对的。这时候,a也罢、“2.4”也罢都不等于数学上的2.4,但两个“臭蛋”相互倒蛮投缘的,都等于某个非常接近于2.4的二进制有理数。一会儿我发个程序上来,就能窥见浮点数的编码形态啦。我再作个解释,OK?


----------------解决方案--------------------------------------------------------

楼上正解!就这么简单!


----------------解决方案--------------------------------------------------------
我是说4楼.
----------------解决方案--------------------------------------------------------

浮点类型能应用于相等测试吗,没听说过


----------------解决方案--------------------------------------------------------

#include<stdio.h>

typedef unsigned char usc;

prt(usc ch,int b)
{
if(b)prt((usc)(ch/2),b-1);
printf("%d",ch%2);
}

main()
{ int i;
union {
float f;
usc a[4];
} x;
x.f = 2.4f;
printf("2.4f的编码(从高位到低位)是\n");
for(i=3;i>=0;i--)
{prt(x.a[i],7);printf(" ");}
printf("\n");
}


----------------解决方案--------------------------------------------------------
呵呵,楼上的程序短小又精悍,我喜欢这种风格!
----------------解决方案--------------------------------------------------------
  相关解决方案