浮点数的存储方式
float
1bit(符号位) | 8bits(指数位) | 23bits(尾数位) |
---|
double
1bit(符号位) | 11bits(指数位) | 52bits(尾数位) |
---|
知识补充—二进制表示的小数
对于二进制的小数:
1.1=1×2
0
+1×2
-1
=1+1/2=1.5;
1.01=1×2
0
+0×2
-1
+1×2
-2
=1+1/4=1.25
1.0011=1×2
0
+0×2
-1
+0×2
-2
+1×2
-3
+1×2
-4
=1+1/8+1/16=1.1875
这样看下去,只要有足够的位数,二进制的小数就可以像十进制数一样表示任何数。但是计算机存储空间是有限的。为了用有限的空间近似出尽量多的小数,制定了一些标准,主要是IEEE754标准。
符号位
0代表正数,1代表负数。
指数位
一共8bit 能表示的数是0-255。因为要表示小数,肯定要有负指数,则指数的范围就是-127-128。
尾数位
这里存储的是真正的二进制小数。
计算方法
以0.09f为例,它的存储是这样的:0 01111011 01110000101000111101100
符号位:0 正数
指数位: 01111011对应十进制的123,加上符号以后就是123-127=-4
尾数位: 此处省略整数部分的1,即为:1.01110000101000111101100
然后计算方式为:
1.01110000101000111101100 * 2^-4
=0.000101110000101000111101100
= 1/16 + 1/64 + 1/128+ 1/256 + …
= 0.0900000035762786865234375
这就是0.09在内存里的存储方式。所以它是不精确的。64位双精度浮点数类似。