IEEE754浮点数标准
IEEE 754 浮点数标准
本⽂是转载,阅读之后的补充如下,供⼤家参考:
1、
2、
IEEE 754标准的主要起草者是加州⼤学伯克利分校数学系教授William Kahan,他帮Intel公司设计了8087浮点数处理器(FPU),并以此为基础形成了IEEE 754标准,Kahan教授也因此获得了1987年的图灵奖。⽬前,⼏乎所有计算机都采⽤IEEE 754标准表⽰浮点数。
在IEEE 754中,定义了两种浮点数格式:32位单精度和64位双精度。
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表⽰扩展双精度(长度和格式随编译器和处理器类型的不同⽽有所不同)。