IEEE754标准是一种浮点数表示标准,一般分为单、双精度两种,也即32位的二进制数和64位的二进制数。根据国际标准IEEE754,任意一个二进制浮点数V可以表示为下面形式:
V = (-1)^s *(1+M)* 2^(E-127)(单精度)
V = (-1)^s *(1+M)* 2^(E-1023)(双精度)
一个浮点数的组成分为三个部分(以单精度为例):最高位是符号位s(0正,1负),2-9位为阶码位E(双精度为2-12位),剩下的为有效数字M。
其中1<= M <2 ,即M写成1.xxxxx形式。IEEE 754规定,计算机内部保存M它的第一位总是1,因此可以只保存后面的xxxxxx部分。如1.001时,尾数001,需要读取时,再把第一位的1加上去。这样做可以节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。
E为一个无符号整数(unsigned int),如果E为8位,其取值范围为0~255;若E为11位,取值范围为0~2047。而科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
其中E还分三种情况:
1)E不全为0或1时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
2)E全为0时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
3)E全为1时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。
下面我们以上图的十进制0.15625转换为浮点数二进制表示为例子展开说明:
第一步,十进制换算为二进制有:DEC 0.15625 = BIN 0.00101 ,换算步骤如下:
0.15625x2=0.3125 取整0 0.31250x2=0.6250 取整0
0.62500x2=1.2500 取整1, 0.25000x2=0.5000 取整0
0.50000x2=1.0000 取整1,结束,依次把得到的组合在小数点后得到:0.00101
(验证:0*2-1 + 0*2-2 + 1*2-3 + 0*2-4 + 1*2-5 = 0.15625 ,换算正确)
第二步,用国际标准IEEE754表示换算好的二进制数:
0.00101表示为:1.01 * 2 -3 由公式:V= (-1)^s *(1+M)* 2^(E-127)(单精度)可得出:
S = 0 ,M = 1.01 -1 = 0.01 ,E = 127 -3 = EDC 124 = BIN 0111 1100
第三步,列出浮点数二进制表示式:
则有:0011 1110 0010 0000 0000 0000 0000 0000 ,和上图的表示一致,结果正确。
附上两个小例子:
例1:
BIN 1101101.1,写成以上形式有:1.1011011*2^6,对应上式得出:S = 0,M = 0.1011011,
E =DEC (127 + 6 )= DEC 133 = BIN 1000 0101,DEC表示十进制,BIN表示二进制
则单精度浮点数表示为:0100 0010 1101 1011 0000 0000 0000 0000
例2:
DEC -0.0625 = BIN -0.0001 = -1.0*2-4 s=1,M=1-1=0,E=-4 +127=123=0111 1011
单精度:1011 1101 1000 0000 0000 0000 0000 0000 (S E M顺序)