首页 > 学院 > 开发设计 > 正文

C语言中浮点数在计算机中的存储

2019-11-11 06:11:03
字体:
来源:转载
供稿:网友

浮点数在内存中存储时,就要提到一个关键词“科学计数法”,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位


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表