Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346581
  • 博文数量: 88
  • 博客积分: 1695
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-06 15:48
个人简介

喜欢美食, 旅行..

文章分类

全部博文(88)

文章存档

2014年(2)

2013年(12)

2012年(14)

2010年(8)

2009年(52)

我的朋友

分类: C/C++

2009-11-02 20:38:35

浮点数绝对误差法的一般做法:

bool IsEqual(double a,double b,double e)
{
        return (a==b||fabs(a-b)}

根据IEEE标准,浮点数在内存中的表示先是一个符号位,之后是阶码,最后是尾数。
阶码的大小可以当成是位数,所以同号的两个浮点数而言,a-b(int &)a是让编译器以int的表示方法去解释a,得到浮点数a对应的整数表示,两个浮点数对应的整数表示做差值运算,得到的整数表示两个浮点数之间有多少个可以表达的浮点数,对于阶码不同的两个数同样有效,只是形式不太一样。
对于异号的两个浮点数,可以借助0和-0来解决,对于64位数据类型double,-0在内存中相当于整型变量1<<63.
设a>0,b<0,则a-b

bool IsEqual(double a,double b,int d)
{
        if ((int &)a>>63^(int &)b>>63) return (int &)a+((int &)b-(1<<63))        return  ((abs((int&)a-(int&)b))}

由于整数比起浮点数运算效率要高得多,所以采用此方法,运行效率会有所提高。

 

文章转自:http://hi.baidu.com/wuxyy/blog/item/ae8cb4fdfe50711609244dea.html

阅读(1448) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~