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

来源:互联网 发布:淘宝免单优惠白菜群 编辑:程序博客网 时间:2024/04/29 05:47

浮点数在内存中存储时,就要提到一个关键词“科学计数法”,floatdouble的存储方式是一样的,下面用float做以解释;任意一个二进制浮点数V可以表示成下面形式:

 

  V=(-1)^S*M*2^E

 

1(-1)^S表示符号位,当S = 0V为正;当S = 1V为负;

2M为有效数字,因为M是二进制,大于等于1,小于2

32^E表示指数位

举例来说:

十进制的5.0,写成二进制是101.0,相当于1.01*2^2。按上面科学计数法的格式,可以得出S = 0M = 1.01E = 2。如果是-5.0S= 1M = 1.01. E = 2

 

 

对于单精度浮点数来讲,占32位,每个bit位存入相应的二进制数,具体看下面:


下面对SME如何存入内存做以解释:

S(符号位):

(-1)^S表示符号位,当S = 0V为正;当S = 1V为负;

 

M(尾数)

1<=M<2;

M要写成1.xxxxxx的形式,xxxxxx表示小数部分,在把M存入计算机时,M的第一位总是1,因此,可以把第一位1在每次存入的时候去掉,只存入小数部分,在读取的时候再在前面加上1,这样就可以用23位全部来存小数部分,等于可以保留24位有效数字。

 

E(阶码):

E为一个无符号整形,E8位时,它的取值范围为0~255;若为double型,E11,它的取值范围是0~2047

但是,在科学计数法中,E是可以表示负数的,所以规定,存入内存时E的真实值必须在加上一个中间值,对于8位的E,这个中间值位127;对于11位的E,这个中间值位1023。在读取的时候在减去127。例如,2^10E10保存成单精度浮点型,存入内存时,必须保存成10+127=137,即10001001,在读取时在减去127

所以E的真实值的范围就变成了127~128.

 

下面在解释E3中特殊情况:

(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其余有效位都为0E存入时为-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位的doubleS1位,E11位,M52


0 0
原创粉丝点击