| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8195 人关注过本帖
标题:浮点数大小比较
只看楼主 加入收藏
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
结帖率:98.68%
收藏
已结贴  问题点数:20 回复次数:8 
浮点数大小比较
浮点数的大小怎么比较,在网上看见与0判等的方法如下,谁能详细解释下,我看了浮点的IEEE754都还不能理解下面的是什么意思.

和零比较的例子:   
   
  const   float   EPSINON   =   0.00001;//此处根据精度定   
  if   ((x   >=   -   EPSINON)   &&   (x   <=   EPSINON))
搜索更多相关主题的帖子: 浮点数 
2009-08-11 21:17
soky
Rank: 4
等 级:业余侠客
帖 子:126
专家分:228
注 册:2009-7-13
收藏
得分:0 
这是c++得题,你去那边问吧,这边懂得差不多是c
2009-08-11 23:04
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 楼主 jingzitakk66

那个意思就是说,当x的绝对值小于 EPSINON 时,if的条件真。 因为实数几乎不能精确表示,所以在比较实数的大小时,应该误差在某个范围内时就认为(近似)相等。 这不是C++特有的语法,在C里也可以这么写。
2009-08-12 12:04
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
收藏
得分:0 
回复 3楼 pangding

还是不明白,我写了以下程序,直接比较也行啊,你能举个例子说明不用
 const   float   EPSINON   =   0.00001;//此处根据精度定   
  if   ((x   >=   -   EPSINON)   &&   (x   <=   EPSINON))
会出现什么问题吗?请举个例子,非常感谢
 
#include"stdio.h"
 
main()
{
    float f;
    while(1){
    scanf("%f",&f);
    if(f==0)
    printf("equal\n");
    else printf("No equa\n");
    }
 
}
2009-08-12 20:25
西园竹
Rank: 5Rank: 5
等 级:职业侠客
帖 子:41
专家分:305
注 册:2009-8-8
收藏
得分:0 
那是说实际中的程序,不是练手的程序,比如你要写一个监控电压的程序,查看电压是否稳定在220v,如果不稳定就调整,
如果你写成
float v;

if (v == 220)
{
    .....
}
那肯定是不成的,因为电压是浮动的,必须确定一个范围,总而言之,浮点数用==来比较是一件很危险的事情
2009-08-12 20:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
回复 4楼 jingzitakk66

一时间也想不出什么实际点的例子说明这个问题,随便写了一个,不过好像没什么说服力:
程序代码:
#include <stdio.h> 
 
int main() 
{ 
    double p = 0.1; 
    double q = 0.10000000000000001; 
 
    if (p == q) 
        puts("=="); 
    else 
        puts("!="); 
 
    return 0; 
}
这个在我的机子上编译输出的是“==”。不知道在你那里是不是同样的结果。其实浮点数表示总有一定的误差的,这就使得本来不同的数变成了相同的(但由于误差不大,还可以接受),但本来可能相等的数,由于计算时有误差,可能没有得出完全相等的结果。如果你以某个值相等为循环目标,一个理论上可以结束的循环可能就成了无限循环,所以我们应该只是给出误差的限制,而不是要求完全相等。 如果你知道浮点数的内部表示,我觉得这个问题应该很容易理解。数值计算方面对这个问题也有很深入的讨论,还有截断误差(truncation error
 
),舍入误差(round error)之类的区别。
2009-08-13 17:15
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
收藏
得分:0 
回复 6楼 pangding

哎,这帖就此了结吧,其实我也知道浮点很麻烦,等以后用到了再做深入分析吧,谢谢大家.
2009-08-13 21:17
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
一个典型的例子是用插值法解一元高次方程。

身体是玩命的本钱
2009-08-13 22:37
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
还有在通过I/0数据收集过程中,所有的数据都不存在所谓的定值(因为有外界的不定的干扰和元件自身的老化) ,对于同一个输入数据(假设有一个恒定的输入值,事实不存在那样恒定的输入东西)在不同的时候收集到的都不一样,所以需要有一个允许的误差范围。

身体是玩命的本钱
2009-08-13 22:48
快速回复:浮点数大小比较
数据加载中...
 
   



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

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