| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 598 人关注过本帖
标题:关于浮点运算误差问题,求教。
只看楼主 加入收藏
mengt2012
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-8-8
收藏
 问题点数:0 回复次数:7 
关于浮点运算误差问题,求教。
程序代码:
#include <stdio.h>
int main(void)
{
    float a,b,c,d;
    scanf("%lf %lf", &a, &b);
    c = 0.999999999;
    d = 1.0;
    if( c==d ){
        printf(" c d 竟然真的相等!\n");
    }
    if( a==b ){
        printf(" a b 竟然真的相等!\n");
    } else {
        printf(" a b \(^o^)/不相等!\n"); 
    }
    return 0;
}

我的a b 值和c d是相等的,可最后输出的是c d相等,a b不相等,为什么会有这种差别呢?
2014-10-23 12:07
mengt2012
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2014-8-8
收藏
得分:0 
大神在哪^^^^^^^^^^^^^
2014-10-23 13:33
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
浮点数可以用 ==  来判断是否相等吗  哪个老师教的

DO IT YOURSELF !
2014-10-23 13:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
先顺便说一句,float 对应的是 "%f",不是 "%lf";c = 0.999999999 应该写成 c = 0.999999999f;

对于你的问题,简洁的回答是:你大脑里比较的是实数,而计算机用的是浮点数

你可以这么想,0.999999999 到 1.0 之间有无穷多个实数,若float能一一表示这无穷多个实数的话,你可以发明一个旷古绝今惊天动地的压缩算法:
比如"abc……",你可以将之拼成 0x616263……,然后你用一个float变量就可以存储0x616263……的倒数。想想多牛逼呀,只要几行代码,却实现了用4字节(float)存储无限数据(可以超过此宇宙的一切信息)的方法。

若不行,那就说明在编译器眼中 c = 0.999999999f; 等于你写的就是 c = 1。
为了防止你有“原来就是将数截断后四舍六入”的错感,我多举个例子,在编译器眼中你写 c=0.1f 就如同看到你直接写的是 c=0.100000001490116119384765625f

浮点数的本质就类似计数上常用的科学计数法,即『1.二进制表示的固定位小数 × 2的n次方』
当编译 c = 0.1f 时,就是找一个能用『1.二进制表示的固定位小数 × 2的n次方』所表示的最接近0.1实数的形式,即 1.10011001100110(二进制)*2的-4次方,换成十进制就是 0.100000001490116119384765625


2014-10-23 14:50
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
我其实之前也没注意过,很少用浮点数。自己查资料了,共同学习
要比较浮点数,可以这样:
float locale, r, d ;
const float EPSINON = 0.0000001;
...   //locale和r已被初始化
d = locale - r;

if(d > EPSINON){}  //两浮点数之差大于零的处理
else if(d < -EPSINON) {} //两浮点数之差小于零
else if(fabs(d) <= EPSINON) {} //两浮点数之差等于零
2014-10-23 17:14
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
FLT_EPSILON

梦想拥有一台龙芯3A-4000
2014-10-23 18:38
gold615
Rank: 2
等 级:论坛游民
帖 子:54
专家分:75
注 册:2014-6-7
收藏
得分:0 
我的理解是 第四行的 float改为 double 。因为之前声明a,b,c,d均为单精度的,c与d的差值 对于这个长度来说太小以至于计算机认为两者相同,但是a与b输入的时候却是按照double输入的,这个差值是可以被识别出来的(可能类似于电路中的分辨率)。
图片附件: 游客没有浏览图片的权限,请 登录注册
2014-10-23 21:32
gold615
Rank: 2
等 级:论坛游民
帖 子:54
专家分:75
注 册:2014-6-7
收藏
得分:0 
回复 4 楼 rjsp
噢 原来是这样
2014-10-23 21:33
快速回复:关于浮点运算误差问题,求教。
数据加载中...
 
   



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

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