浮点数在内存中的存储方式
以单精度浮点数(float)为例子
(-1)s * M * 2E
其中S代表符号位,0表示该浮点数为正数,1则表示该浮点数为负数
M表示有效数字,1<=M<2;
E表示指数位
单精度浮点数中,S占1位,M占23位,E占8位
双精度浮点数中,S占1位,M占52位,E占11位
以4.25为例子
4.25(十进制)= 100.01(二进制)
需要先把二进制进行移位,使得整数部分只有1,100.01 = 1.0001 * 2<sup>2</sup>;
因为4.25是正数,所以符号位S = 0,M = 1.0001,E = 2;
IEEE754对M的特殊规定
因为是二进制数,1≤M<2
,而M可以写成 1.xxxxxx
的形式,其中xxxxxx是小数部分
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分
比如保存1.01的时候,只保存小数点后的01,等到读取的时候,再把第一位的1加上去
这样做的目的是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。
1、十进制转二进制
以4.25为例子,整数和小数部分分开转,整数部分除二取余法,4(十进制)=100(二进制);
小数部分则不断乘以2,然后取整数部分(0和1都保留),然后再用剩余小数部分继续乘以2,直至小数部分为0;
0.25*2=0.5,取0;0.5 * 2 = 1.0,取1。则小数部分为.01
综合4.25(十进制) = 100.01
2、二进制转十进制
整数部分和小数部分分开算,100 (二进制)= 22=4(十进制);
.01(二进制) = 2-2=1/4=0.25(二进制)