Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3034570
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: C/C++

2011-10-04 16:20:21

2.4 浮点数
浮点表示对形如V=x*2^y的有理数进行编码。但是同样由于计算机存储的有限性,浮点数表示往往通过舍入取得近似值。
2.4.1 二进制小数
如同十进制的表示:
101.11(10)--- 1×10^2 0×10^1 1×10^0 1×10^-1 1×10^-2=101.11
二进制时:
101.11(2)--- 1×2^2 0×2^1 1×2^0 1×2^-1 1×2^-2=4 1 1/2 1/4=5(3/4)
基本的原理是存储的每一位依次乘以其对应的权值即可。
对于V=x×2^y形式的数,二进制小数可以精确表示,方法是:(1)将x写成二进制数;(2)若y>0,则小数点向右端移y位;若y<0,则小数点从右端向左端移动y位。
这里的原理是对于二进制小数,小数点每向右移动一位相当于乘以2,每向左移动一位,相当于除以2.
2.4.2 IEEE浮点表示
二进制小数在表示非常大的数字时便不是很有效,如5×2^100,在101后要添加100个0. IEEE规定了一个浮点数标准,使得可以在有限的字长下表示浮点数。
IEEE浮点标准:V=(-1)^s×M×2^E
这里s是符号位,M为尾数,E为阶码。实际存储中,由下面的s, frac, exp决定:
float--- s(1) exp(8) frac(23)    total:32bits
double--- s(1) exp(11) frac(52)   total:64bits
这里面采用一些列规定根据s, exp,frac存储的位模式的不同来决定一个浮点数的值,具体的参见课本。
2.4.4 舍入
由于浮点数常常是真实值的近似值,所以我们要对其进行舍入(rounding)来获得想要的值。舍入方法有很多种,但是默认的是向偶数舍入(round2even),这样可以减少很多统计误差。其方法是:
(1)数值小于中间值,则向下舍入;数值大于中间值,则向上舍入;
(2)数值恰好等于中间值,则遵循向偶数舍入。
2.4.5 浮点运算
浮点运算会发生舍入,因此不具有通用的结合性。典型的例子如:(3.14 1e10)-1e10=0!而3.14 (1e10-1e10)=3.14!忽视浮点数不具有结合率往往是隐蔽程序错误漏洞的根源。

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