浮点数在内存中存储时,就要提到一个关键词“科学计数法”,float和double的存储方式是一样的,下面用float做以解释;任意一个二进制浮点数V可以表示成下面形式:
V=(-1)^S*M*2^E
(1)(-1)^S表示符号位,当S = 0,V为正;当S = 1,V为负;
(2)M为有效数字,因为M是二进制,大于等于1,小于2。
(3)2^E表示指数位
举例来说:
十进制的5.0,写成二进制是101.0,相当于1.01*2^2。按上面科学计数法的格式,可以得出S = 0,M = 1.01,E = 2。如果是-5.0,S= 1,M = 1.01. E = 2。
对于单精度浮点数来讲,占32位,每个bit位存入相应的二进制数,具体看下面:
下面对S,M,E如何存入内存做以解释:
S(符号位):
(-1)^S表示符号位,当S = 0,V为正;当S = 1,V为负;
M(尾数):
1<=M<2;
M要写成1.xxxxxx的形式,xxxxxx表示小数部分,在把M存入计算机时,M的第一位总是1,因此,可以把第一位1在每次存入的时候去掉,只存入小数部分,在读取的时候再在前面加上1,这样就可以用23位全部来存小数部分,等于可以保留24位有效数字。
E(阶码):
E为一个无符号整形,E为8位时,它的取值范围为0~255;若为double型,E为11,它的取值范围是0~2047。
但是,在科学计数法中,E是可以表示负数的,所以规定,存入内存时E的真实值必须在加上一个中间值,对于8位的E,这个中间值位127;对于11位的E,这个中间值位1023。在读取的时候在减去127。例如,2^10的E是10保存成单精度浮点型,存入内存时,必须保存成10+127=137,即10001001,在读取时在减去127。
所以E的真实值的范围就变成了127~128.
下面在解释E的3中特殊情况:
(1)E不全位0或不全为1
读取时指数E的计算值减去127,得到真实值,再将有效数字M前加上1.
比如:
0.5的二进制形式为0.1,由于规定M必须大于1小于2,则0.1的小数点右移1位,则为1.0*2^(-1),M1.0去掉正数部分的1其余有效位都为0;E存入时为-1+127 = 126,表示为二进制为01111110,,则其二进制为
0 01111110 00000000000000000000000
(2)E为全0
这时E为最小,浮点数的指数E等于0-127+1即为真实值,有效数字M不再加上第一位的1,
即读取为0.xxxxxx的小数。这个数表示正负0,是一个接近0的很小的值。
(3)E位全1
这时,如果有效数字M全位0,表示正负无穷大(正负取决于符号S)。
对于占64位的double,S占1位,E占11位,M占52位
新闻热点
疑难解答