首先得知道每一位数都有自己的权重,举个例子:5转换位二进制是101,这里第一个1的权重是2^2,0的权重是2^1,最后面的1是2^0 那如果在往后走就是2^-1即0.5,这样就可以写出5.5的二进制。
浮点数的存储遵循一个公式:(-1)^S*M*2^E 这里(-1)^S表示的时符号位如果S为1表示的是负数,如果S为0表示的是正数,M表示的是有效位,取值范围是1-2,例如上边的5.5的M就是1.011,E表示的是指数,原来的二进制位中的小数点向左移动几位E就是几。
得到了S.M和E,就该把他们存起来了float中第一位存放符号位,后面8位存放指数E剩下的23位存放M;在double类型中,第一位存放符号位,后面的11位存放指数E,最后的52位存放M。
因为M都是属于(1,2)的所以M的前面都是1.xxx那在存放的时候就可以省略到时候还原在加上去就可以了,那每一个M都在原来的基础上少一个固定的1就可以多存放后面的以为数值使存储的精度更高。
这里规定E位无符号数,那么就没有负数,但是存储的数值可能是负数,为了防止出现这样的情况在存储E时加上中间值然后存储,float的E存储时+127然存储,double的E加上1023然后存储。
浮点数的取出
分为三种情况
1.E不全为0或不全为1
E的现有值-127(1023)得到E的真实值,将有效位的前面加上1 取出符号位,按公式:(-1)^S*M*2^E在转成十进制就得到存储前的数值了
2.E全为0
这时候指数E直接为-126或者-1022,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
3.E全为1
如果M全为0,该数表示的是+-无穷大的数