根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式
V=(-1) ^ s * M * 2 ^ E
(-1) ^ s表示符号位,当s=0,V为正数;当s=1,V为负数
M表示有效数字,范围属于[1,2)
2 ^ E 表示指数位
例.
另外,IEEE754对M和E,还有一些特殊规定
对于M:前面提到,M属于[1,2),写成1.xxxxxx的形式(xxxxxx表示小数部分)
规定:在计算机内部保存M时,M的第一位总是1,因此可以被舍去,只保留xxxxxx部分。等到读取时再把第一位的1加上。(M只有23 bit,此操作可以节省一位有效数字,等同于保存24位数字)
对于一些小数,例如5.3(10进制),转化为2进制时,小数后位数超过23 bit,在计算机内部不能精确保存,有误差。如图:
对于E(存入): E是一个无符号整数
如果E时8位,取值范围:[0,255] E为11位,取值范围:[0,2047]
但事实上,E可以为负数(0.5=1 * 2^(-1),此时E为-1),所以
规定:存入内存的值 = E的真实值(上述的-1)+ 中间数(8位E:127 11位E:1023)
举例:5.5(10进制)--> 101.1(2进制)
用s,M,E表示;V=(-1)^0 * 1.011 * 2^2(其中E需要加上127)
存储为:0(s) 1000 0001(E) 01100000000000000000000 (M剩下位置用0补)
0100 0000 1011 0000……(16进制:40 b0 00 00)
取出E:分为三种情况
1.E不全为0或不全为1
E存入的值 - 127 = E的真实值,再将M前加上第一位的1
2.E全为0
E的真实值直接为1 - 127(double: 1-1023)= - 126
有效数字M不再加上第一位的1,而是还原为 0.xxxxxx 的小数
这样做是为了表示 +0,以及一个接近于 0很小的数字。
3.E全为1
如果有效数字M全为0,表示无穷大(正负取决于符号位 s)。