浮点数

原创 2012年03月26日 20:41:41

1、浮点数

  浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。

2、浮点计算

  是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。

  一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

3、结构

  由此可以看出,在计算机中表示一个浮点数,其结构如下:

  尾数部分(定点小数阶码部分(定点整数)

  

数符± 尾数m 阶符± 阶码e

 这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。

4、浮点加法减法运算

 设有两个浮点数x和y,它们分别为

  x=2Ex·Mx

  y=2Ey·My

  其中Ex和Ey分别为数x和y的阶码,Mx和My为数x和y的尾数。

  两浮点数进行加法和减法的运算规则是

  x±y=(Mx2Ex-Ey±My)2Ey, Ex<=Ey

  完成浮点加减运算的操作过程大体分为四步:

  1. 0 操作数的检查;

  2. 比较阶码大小并完成对阶;

  3. 尾数进行加或减运算;

  4. 结果规格化并进行舍入处理。

  (1) 0 操作数检查

  浮点加减运算过程比定点运算过程复杂。如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。0操作数检查步骤则用来完成这一功能。

  (2) 比较阶码大小并完成对阶

  两浮点数进行加减,首先要看两数的阶码是否相同,即小数点位置是否对齐。若二数阶码相同,表示小数点是对齐的,就可以进行尾数的加减运算。反之,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作对阶。

  要对阶,首先应求出两数阶码Ex和Ey之差,即

  △E = Ex-Ey

  若△E=0,表示两数阶码相等,即Ex=Ey;若△E>0,表示Ex>Ey;若△E<0,表示Ex<Ey。

  当Ex≠Ey 时,要通过尾数的移动以改变Ex或Ey,使之相等。原则上,既可以通过Mx移位以改变Ex来达到Ex=Ey,也可以通过My移位以改变Ey来实现Ex=Ey。但是,由于浮点表示的数多是规格化的,尾数左移会引起最高有效位的丢失,造成很大误差。尾数右移虽引起最低有效位的丢失,但造成误差较小。因此,对阶操作规定使尾数右移,尾数右移后阶码作相应增加,其数值保持不变。显然,一个增加后的阶码与另一个阶码相等,增加的阶码的一定是小阶。因此在对阶时,总是使小阶向大阶看齐,即小阶的尾数向右移位(相当于小数点左移)每右移一位,其阶码加1,直到两数的阶码相等为止,右移的位数等于阶差△E。

  (3) 尾数求和运算

  对阶结束后,即可进行尾数的求和运算。不论加法运算还是减法运算,都按加法进行操作,其方法与定点加减法运算完全一样。

  (4) 结果规格化

  在浮点加减运算时,尾数求和的结果也可以得到01.ф…ф或10.ф…ф,即两符号位不等,这在定点加减法运算中称为溢出,是不允许的。但在浮点运算中,它表明尾数求和结果的绝对值大于1,向左破坏了规格化。此时将运算结果右移以实现规格化表示,称为向右规格化。规则是:尾数右移1位,阶码加1。当尾数不是1.M时需向左规格化。

  (5) 舍入处理

  在对阶或向右规格化时,尾数要向右移位,这样,被右移的尾数的低位部分会被丢掉,从而造成一定误差,因此要进行舍入处理。

  简单的舍入方法有两种:一种是"0舍1入"法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位加"1"。另一种是"恒置一"法,即只要数位被移掉,就在尾数的末尾恒置"1"。

  在IEEE754标准中,舍入处理提供了四种可选方法:

  就近舍入 其实质就是通常所说的"四舍五入"。例如,尾数超出规定的23位的多余位数字是10010,多余位的值超过规定的最低有效位值的一半,故最低有效位应增1。若多余的5位 是01111,则简单的截尾即可。对多余的5位10000这种特殊情况:若最低有效位现为0,则截 尾;若最低有效位现为1,则向上进一位使其变为 0。

  朝0舍入 即朝数轴原点方向舍入,就是简单的截尾。无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。这种方法容易导致误差积累。

  朝+舍入 对正数来说,只要多余位不全为0则向最低有效位进1;对负数来说则是简单的截尾。

  朝-∞舍入 处理方法正好与 朝+∞舍入情况相反。对正数来说,只要多余位不全为0则简单截尾;对负数来说,向最低有效位进1。

  (6) 溢出处理

  浮点数的溢出是以其阶码溢出表现出来的。在加\减运算过程中要检查是否产生了溢出:若阶码正常,加(减)运算正常结束;若阶码溢出,则要进行相应处理。另外对尾数的溢出也需要处理。

  阶码上溢 超过了阶码可能表示的最大值的正指数值,一般将其认为是+∞和-∞。

  阶码下溢 超过了阶码可能表示的最小值的负指数值,一般将其认为是0。

  尾数上溢 两个同符号尾数相加产生了最高位向上的进位,将尾数右移,阶码增1来重新对齐。

  尾数下溢 在将尾数右移时,尾数的最低有效位从尾数域右端流出,要进行舍入处理。

  例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。

5、特别数值

 此外,浮点数表示法通常还包括一些特别的数值:+∞和?6?1∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。

6、二进制表示

 众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外。然而浮点数的二进制表示法却不像定点数那么简单了。

7、浮点数的概念

 先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。

  C++中的浮点数有6种,分别是:

  float:单精度,32位

  unsigned float:单精度无符号,32位

  double:双精度,64位

  unsigned double:双精度无符号,64位

  long double:高双精度,80位

  unsigned long double:高双精度无符号,80位(应该是C++中最长的内置类型了)

定点数与浮点数

  • 2015年03月17日 21:12
  • 3.92MB
  • 下载

浮点数(谁偷了你的精度?)

单单是说明 IEEE浮点数 就可以写一本书了,我将用几篇博文来简单的说说我所理解的浮点数,算是抛砖引玉吧。 一次面试 记得多年前我招聘 Java 程序员时的一次关于浮点数、二分法、编码的面...
  • devgis
  • devgis
  • 2012年11月14日 08:37
  • 791

实现2个浮点数做除法的ip

  • 2017年11月01日 10:58
  • 14.71MB
  • 下载

浮点数相加ip

  • 2017年11月01日 10:51
  • 8.14MB
  • 下载

浮点数float累加误差解决方式总结

首先是float累加产生误差的原因,该部分转自:http://blog.csdn.net/zhrh0096/article/details/38589067 1.  浮点数IEEE 754表示方法...
  • wolf96
  • wolf96
  • 2017年07月10日 00:10
  • 1095

浮点数转换为hex字符串

  • 2014年11月12日 14:15
  • 6KB
  • 下载

浮点数的分数表达

  • 2016年01月02日 15:39
  • 1KB
  • 下载

浮点数在计算机中存储方式

转自 http://blog.csdn.net/wuna66320/article/details/1691734#comments http://cruih.iteye.com/blog/127...

关于浮点数的精度问题

  • 2013年11月03日 14:30
  • 39KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浮点数
举报原因:
原因补充:

(最多只允许输入30个字)