例:{
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等则反而是准确的,就这么奇怪.
这应该是因为,2.4 是默认为double类型的,你在弄表达式a==2.4时是float 与 double 混用,会出现问题,改成a==(float )2.4就可以了.
这应该是因为,2.4 是默认为double类型的,你在弄表达式a==2.4时是float 与 double 混用,会出现问题,改成a==(float )2.4就可以了.
对的。这时候,a也罢、“2.4”也罢都不等于数学上的2.4,但两个“臭蛋”相互倒蛮投缘的,都等于某个非常接近于2.4的二进制有理数。一会儿我发个程序上来,就能窥见浮点数的编码形态啦。我再作个解释,OK?
#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");
}