float类型
在内存中的表示
s | eeeeeeee | mmm mmmm mmmm mmmm mmmm mmmm
- float类型在计算机中用4个字节存储,32位的各部分划分如下
- 31位(符号位):符号,0为正,1为负
- 23-30位(指数位):用八位存储指数部分
- 是指数部分e+127的二进制表示(指数位本应该可以表示正负指数的,但没有符号位,因此,指数位部分通过加上偏差值127来表示正负)
- 计算方法(不断除2至整数位是1)
- 0-22位(尾数位):存储小数部分
- 2^(-1) + 2^(-2) + 2^(-3) + …
- 计算方法(除以指数后的值-1,然后分解为上述2的负指数相加)
- 由于m总是大于1小于2的,也就是m写成1.xxxxxxx的形式,其中xxxxxxx表示小数部分。所以计算机在保存时总是默认把1去掉
- 由于2^(23+1) 等于 16777216,10^7 < 16777216 < 10^8,所以单精度浮点型的有效位数是七位
(−1 )^s × (1+m )× 2^e
- 例1 :-6.625
- bit31: 首位应该是1
- bit23-30: 6.625/(2^2) = 1.65625,所以指数为2+127=129,二进制表示“1000 0001”
- bit0-22: m = (1.65625-1) = 0.65625 = 2^(-1) + 2^(-3) + 2^(-5),二进制表示"101 0100 0000 0000 0000 0000"
- 所以最终的结果二进制表示为“1100 0000 1101 0100 0000 0000 0000 0000”,十进制表示为“ 3235119104”
- 例1 : 2.34E+22f
- 二进制表示为“0110 0100 1001 1110 1001 0000 1000 1000”
- 符号位为0,该浮点数为正数
- 指数位为“1100 1001”,十进制表示201,201-127 = 74
- 尾数位“001 1110 1001 0000 1000 1000”,2^(-3) + 2^(-4) + 2^(-5 )+ 2^(-6) + 2^(-8 )+ 2^(-11) + 2^(-16 )+ 2^(-20)约等于0.238785743713379
- 最终结果为(1+0.238785743713379)*2^74 = 2.34E+22f