Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156990
  • 博文数量: 7
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-30 13:00
文章存档

2008年(7)

我的朋友

分类: C/C++

2008-04-24 15:20:39

浮点数的比较
 

1.两个浮点数为什么不能像整数那样直接用==比较是否相等?
因为浮点数有精度问题。

2.浮点数为什么会有精度问题?
在计算机中,数字都是以二进制的形式存在的,由于浮点数在十进制转为二进制的过程中,常常不能正好转到完全相等(例如1.0/3.0这样的数必然会损失,而像1.0/5.0这种数才不会有任何损失),所以就产生了精度问题。

3.如何实现浮点数的比较?
小浮点数的比较采用绝对误差法;
大浮点数的比较采用相对误差法;
对于一般的浮点数必须采用相对误差和绝对误差相结合的方式才可以达到目的。

bool IsEqual(double a,double b,double e1,double e2)
{
         if (a==b||fabs(a-b)         if (fabs(a)>fabs(b)) return   (fabs((a-b)/a)>e2)?1:0;
         return   (fabs((a-b)/b)>e2)?1:0;
}

 

浮点数的二进制表示

234.5

单精度float型4字节
01000011011010101000000000000000
最高位符号位是0,表示正数 s = +1
接下来的8位是指数位10000110 == 134,表示指数e = 134-127=7,即2^e = 2^7
剩下的23位是尾数,隐含2^0,所以11010101000000000000000 表示m = 2^0 + 2^-1 + 2^-2 + 2^-4 + 2^-6 + 2^-8
最后浮点数就是s * 2^e * m

阅读(1308) | 评论(0) | 转发(0) |
0

上一篇:如何阅读源代码--工具篇

下一篇:没有了

给主人留下些什么吧!~~