根据国际标准IEEE(电气电子工程师学会)规定,任意一个二进制浮点数V可以写成
(-1)^S*M*2^E;
(-1)^S表示符号位;
当S=0时,V为正数;当S=1,V为负数;
M表示有效数字,大于等于1,小于2;
列如:
V=5.0f=1.01*2^2=(-1)^2^2
这里S=0;M=1;E=2;
IEEE74规定:
对于32位的浮点数,最高位的一位是符号位S,接着的8位是指数E。剩下的23位为有效数字M;
对于64位的浮点数,最高位的一位是符号位S,接着的11位是指数E。剩下的52位为有效数字M;
而且M存储时,只存小数点后面的位。
下面以V=5.5f为列子:
5.5f的二进制数为101.1;
所以写成标准式为(-1)^0*1.011*2^2
S=0,M=1.011,E=2;
对于单精度浮点数float,存储时E为:E(真实值)+127(中间值);上述加127即为2+127=129,对应的
二进制序列为1000 0001;
而对于双精度浮点型double来说,存储时E为:E(真实值)+1023(中间值);
然后,指数
E
从内存中取出还可以再分成三种情况:
E
不全为
0
或不全为
1
这时,浮点数就采用下面的规则表示,即指数
E
的计算值减去
127
(或
1023
),得到真实值,再将
有效数字
M
前加上第一位的
1
。
比如:
0.5
(
1/2
)的二进制形式为
0.1
,由于规定正数部分必须为
1
,即将小数点右移
1
位,则1.0*2^(-1),其阶码为
-1+127=126
,表示为 01111110,而尾数
1.0
去掉整数部分为
0
,补齐
0
到
23
位
00000000000000000000000,则其二进制表示形式为:
0 01111110 00000000000000000000000
E
全为
0
这时,浮点数的指数
E
等于
1-127
(或者
1-1023
)即为真实值,
有效数字
M
不再加上第一位的
1
,而是还原为
0.xxxxxx
的小数。这样做是为了表示
±0
,以及接近于
0
的很小的数字。
E
全为
1
这时,如果有效数字
M
全为
0
,表示
±
无穷大(正负取决于符号位
s
);