| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1128 人关注过本帖
标题:[讨论]关于float的问题?谁能仔细讲解一下?
只看楼主 加入收藏
peiyq401
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-5-5
收藏
 问题点数:0 回复次数:19 
[讨论]关于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 讲解 
2006-05-05 14:53
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
以下是引用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等则反而是准确的,就这么奇怪.


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 15:02
peiyq401
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-5-5
收藏
得分:0 
哦,好象有点明白了,可是为什么double类型的就能准确表达呢?这时0.1,0.2之类的数据是准确的吗?
2006-05-05 15:07
andyss
Rank: 1
等 级:新手上路
帖 子:189
专家分:0
注 册:2006-4-8
收藏
得分:0 

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


幽幽黄桷兰----建四狼
2006-05-05 15:12
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
以下是引用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?


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 15:20
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 

楼上正解!就这么简单!


我的原则很简单:不做不喜欢的事!
2006-05-05 15:21
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 
我是说4楼.

我的原则很简单:不做不喜欢的事!
2006-05-05 15:23
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 

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


日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-05 15:24
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

#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");
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-05 15:49
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
呵呵,楼上的程序短小又精悍,我喜欢这种风格!

对不礼貌的女生收钱......
2006-05-05 15:53
快速回复:[讨论]关于float的问题?谁能仔细讲解一下?
数据加载中...
 
   



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

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