浮点数在电脑中如何存储的
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式
(-1)^S*M*2^E
-1^S表示符号位,当s=0,V表示正数,当s=1,V为负数
M表示有效数字,大于等于1,小于2
2^E表示指数位
什么意思呢?
例如:5.5
5在二进制中是101,而后面的.5是表示1,因为小数点后面的第一位是从2的负一次方开始算的,所以是101.1
按照科学计数法就表示成1.011*2^2
V=5.5
=1.011*2^2
=(-1)^0*1.011*2^2
S=0
M=1.011(换成科学计算法后的二进制数)
E=2 (这里是换算成科学计数法后原本的数向前移动了几位)
在32位的机器float的存储
s | E | E | E | E | E | E | E | E | M |
s(1bit) E(8bit)M(23bit)
在64位的机器float的存储
S | E | E | E | E | E | E | E | E | E | E | E | M |
s(1bit) E(11bit)M(52bit)
M有特定的规定
取值范围是1<=M<2, M也可以写成1.XXXX的形式,其中XXXX表示的是小数
在计算机中保持M的值的时候,默认第一位都是1,因此是可以舍弃的,只保存小数点后面的数,当读取的时候,在加回原来的1就可以了,这样留给M的空间就有23/52位
E为无符号整数,如果是8bit取值范围为0-255,11bit取值范围为0-2047,但是在科学计数法中E是可以出现负数的,在存入内存中E的真实值必须加上一个中间数,对于8位的E,中间值数127,对于11位的E中间值的1023
例如:2^10中E是10,在32位浮点数时,保存的是10+127=137,转换二进制是10001001
指数E在内存中取出分为3种情况
E不全为0或不全为1
指数E减去127/1023得到真实值,再加上有效数字M前加上第一位的1
E全为1
有效数字M全为0,表示浮点数表示的数字非常大
E全为0
浮点数的指数E等于1-127/1-1023即为真实值,有效数字M不需要加上第一位的1