| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2562 人关注过本帖
标题:浮点小数的比较
只看楼主 加入收藏
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:7 
浮点小数的比较
我想比较浮点小数的大小,却出现了个问题
程序如下:
#include<stdio.h>
#include<math.h>
main()
{
float a;
scanf("%f",&a);
if(fabs(a-0.3)>0&&fabs(a-0.3)<1.0e-1)
printf("hao\n");
else printf("bu hao\n");
}
我想要的效果是当输入0.3000000到0.3999999的数时条件成立,其余的条件不成立;
为什么我输入0.2时输出的结果也是"hao"呢?
0.2-0.3的值为-0.1绝对值为0.1,不满足条件fabs(a-0.3)<1.0e-1。
我把条件改为if(flabs(a-0.3)=0)时,输入0.3却输出“bu hao",
0.3-0.3不是等于0吗?为什么会是条件不成立?

哈哈,我已经试出来答案了,结果在最后一楼。

[ 本帖最后由 小赵q1 于 2011-11-29 23:35 编辑 ]
搜索更多相关主题的帖子: include 绝对值 
2011-11-29 16:43
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:25 
if(flabs(a-0.3)==0)
我的是fabs函数,不过结果和你的一样。我想应该是fabs(0.2-0.3)!=fabs(0.4-0.3)
2011-11-29 21:31
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
在回答这个问题之前,让我们先考虑这样的一个问题:0.2转化成二进制是什么数?
答案是(0.2)10=(0.001100110011001100110011....)2
在计算机当中存储的时候,只能够存储有限位数的二进制数,因此在存储数0.2的时候,计算机是用了一个跟0.2很接近的数表示0.2的。就好像我们平常有很多问题采用“四舍五入”的方法精简计算一样。
而在计算机当中0.2跟0.20000000000000000000000000000000000000001是相等的。

因此,在计算两个实数值是否相等的时候,一般采用的方法不能够使用等号来判断,而是采用“相对相等”的方法
一个办法是做差法,比如实数a与b,我们认为当a和b足够接近的时候,就认为他们是相等的,fabs(a-b)<eps,就好像我们在比较两根毛线是否一样长的时候,在他们差不多一样长的时候我们也会说他们一样长。
另一个是做商法,fabs(a/b-1)<eps,同样的道理,不过一般用于比较多个不同数量级上的数据所采用的方法,或者是“相差千分之几”的方法。
2011-11-29 21:44
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
没有想到很好的办法解决这个问题。。。
2011-11-29 22:08
星火gavin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:170
注 册:2011-11-5
收藏
得分:15 
#include<stdio.h>
#include<math.h>
main()
{
float a;
scanf("%f",&a);
if((a-0.3)>=0&&(a-0.3)<=1)
printf("hao\n");
else printf("bu hao\n");
}
编译器不同吧,我的就可以,符合要求,C-Free 5.0
2011-11-29 22:31
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 4楼 laznrbfe
一时没注意,那里应该是fabs我给打成flabs了,呵呵。
我想实现的功能是在输入0.300000000到0.3999999999时条件成立,其余时条件不成立
该怎样改呢?
输入0.2时是-0.1的绝对值它运行成立,输入0.4时是0.1它却不成立,呵呵,
其实你说的我明白的差不多了,浮点型小数不能只看表面,所以不能直接比较只能用跟非常接近的一个数比较
2011-11-29 22:45
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
我其实是想做个程序计算10的阶乘,输出从1到10每个阶乘的值,并计算每个结果的位数,比如结果是一位数,就输出结果,并输出1,结果是3位数,就输出结果并输出3,以此类推;
里面要用到这个条件就是比如当输入的值为0.300000到0.399999之间时条件成立,其余不成立,

只用在原程序里改下条件if(a-0.3>0&&a-0.3<0.1)就能实现想要的结果,

我想做的程序大家有兴趣可以自己做下哦,呵呵
2011-11-29 23:41
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 7楼 小赵q1
if(a-0.3>0&&a-0.3<0.1)
我觉得还是不能解决你的问题。绝对值。。。
2011-11-30 19:54
快速回复:浮点小数的比较
数据加载中...
 
   



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

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