关于   小悟志   网站地图   归档   友情链接   联系   Feed

   云上小悟  +  

当前位置 : 首页 » InfoTech » IEEE 754 浮点数标准 正文

IEEE 754 浮点数标准

2017年5月30日 / 42次阅读  InfoTech
标签:计算机

拍拍贷

IEEE 754标准的主要起草者是加州大学伯克利分校数学系教授William Kahan,他帮Intel公司设计了8087浮点数处理器(FPU),并以此为基础形成了IEEE 754标准,Kahan教授也因此获得了1987年的图灵奖。目前,几乎所有计算机都采用IEEE 754标准表示浮点数。

在IEEE 754中,定义了两种浮点数格式:32位单精度和64位双精度。

IEEE 754浮点数格式

IEEE 754浮点数格式

(单精度和双精度都有一个固定的1bit符号位,因此,浮点数不存在unsigned这个概念,都是有符号的)

 

IEEE 754 的规定:

32位单精度格式中包含1bit符号位s,8bit阶码e,23bit尾数f;

64位双精度格式中包含1bit符号位s,11bit阶码e和52bit尾数f;

基数隐含为2;(基数越大,浮点数能够表示的范围越大,但是精度越低,数变得更稀疏,选择2作为隐含的基数,就是为了精度,并通过双精度来提高表示范围)

尾数f用原码表示,第一位总是1,因而可在尾数中省略第一位的1,称为隐藏位,这样使得单精度格式的23bit尾数实际表示了24bit有效数字,双精度格式的52bit的尾数实际上表示了53bit有效数字。IEEE 754规定隐藏位1的位置在小数点之前。

阶码用移码表示,但偏置常数并不是通常n位移码所用的2^(n-1),而是2^(n-1)-1;因此,单精度浮点数偏置常数为127,双精度浮点数偏置常数为1023。因为尾数f中有一位在小数点之前的1的隐藏位中,所以,如果尾数换成用等值的纯小数表示的话,阶码就需要加1,相当于偏置常数为128和1024。这样做带来两个好处:

(1)尾数可表示的位数多了一位,因而使浮点数的精度更高;

(2)阶码的可表示范围更大,因而使浮点数范围更大。例如:对于单精度浮点数格式,其阶码为8位,当偏置常数用128时,最大机器码11111111对应的值是255-128=127,当偏置常数用127时,其对应的值为255-127=128。显然,偏置常数采用127时,阶码的范围更大。

推荐学习:

原码,反码,移码

补码,模运算和溢出

计算机数据的机器级表示

 

单精度浮点数(32位)的解释:

值的类型      符号      阶码      尾数       值

正零             0           0            0             0

负零             1           0            0             -0

正无穷大    0          255         0             ∞

负无穷大    1           255         0            -∞

无定义数    0/1      255         ≠0          NaN(Not a Number)

规格化

非零正数    0       0<e<255     f          2^(e-127)(1.f)

规格化

非零负数     1       0<e<255     f         -2^(e-127)(1.f)

非规格化

正数             0          0        f≠0       2^(-126)(0.f)

非规格化

负数              1          0       f≠0       -2^(-126)(0.f)

(阶码是0或255时,都表示特殊含义,因此最小阶码-126,加上偏置之后,是1。)

 

双精度浮点数(62位)的解释:

值的类型      符号      阶码      尾数       值

正零             0           0            0             0

负零             1           0            0             -0

正无穷大    0          2047         0             ∞

负无穷大    1           2047         0            -∞

无定义数    0/1      2047         ≠0          NaN(Not a Number)

规格化

非零正数    0       0<e<2047     f          2^(e-1023)(1.f)

规格化

非零负数     1       0<e<2047     f         -2^(e-1023)(1.f)

非规格化

正数             0          0        f≠0       2^(-1022)(0.f)

非规格化

负数              1          0       f≠0       -2^(-1022)(0.f)

 

虽然零有+0和-0,一般情况下,两者是等效的。

 

浮点数的表示范围和非规划数:

从上面的知识可以看出,浮点数也是由范围的,双精度的范围比单精度呀高。

在计算机表示整数的概念里面,有一个溢出的概念,overflow。浮点数同样有益处的概念,不过浮点数的溢出稍微复杂一点,浮点数一共有4个溢出区域:正上溢,正下溢,负下溢,负上溢

在IEEE 754标准中,非规格化数(小数点前固定是0)就是用来填补正下溢和负下溢这两个接近0的空间。

当计算结果非常小的时候,已经小于规格化数(小数点前固定是1)能够表示的最小值,这时的计算采用“逐级下溢”的方式:

当运算结果的阶码太小,比最小能表示的阶码还小,即小于-126或小于-1022时,尾数右移,价码加1,如此循环直到尾数为0或阶码达到可表示的最小值(尾数不能为全0,实际看到的效果是,阶码是0,f不等于0,但是f一直在右移,左边0 的个数越来越多)。

 

浮点数的密度问题:

对于n为二进制编码,所能表示的不同的数据最多有2^n个,因此,浮点数虽然表示范围扩大了,但与定点数相比,并没有能够表示更多的数。实际上,只是这些数在数轴上朝正负两个方向在更大的范围内散开,在数轴上的分布变稀疏了。定点数分布是等距且紧密的,而浮点数分布是不等距且稀疏的,越远离原点越稀疏。

下面这段文字,很好的解释了浮点数的密度问题,以及非规格化数带来的范围变化:

浮点数的密度问题

浮点数的密度问题

 

双精度浮点数扩展:

IEEE 754规定,双精度扩展格式必须至少具有64位有效数字,并总共占用至少79位,但没有规定其具体的格式,处理器厂家可以选择符合该规定的格式。

例如:Intel x86 FPU采用80位双精度扩展格式,包含4个字段:1个符号位,15位阶码(偏置常量为16383),一位显示首位有效位(explicit leading significant bit)和63位尾数。Intel采用的这种扩展浮点数格式与IEEE 754规定的格式有一个重要的区别,它没有隐藏位,有效位数共64位。Intel 安腾FPU采用82位扩展精度。

又如:SPARC和Power PC处理器中采用128位扩展双精度浮点数格式,包含一位符号位,15位阶码(偏置常量为16383),和112位尾数,采用隐藏位,所以有效位数为113位。

 

浮点数在C语言中的表示:

float表示单精度;

double表示双精度;

long double表示扩展双精度(长度和格式随编译器和处理器类型的不同而有所不同)。

本文链接:http://www.maixj.net/ict/ieee-754-15568
云上小悟 麦新杰(QQ:1093023102)

-- (*^-^*) --

相关文章

评论是美德

无力满足评论实名制,评论对非实名注册用户关闭,有事QQ:1093023102.


前一篇:
后一篇:

栏目精选


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号苏ICP备14045477号-1

网站二维码
拍拍贷
go to top