C语言——浮点型的存储

  • Post author:
  • Post category:其他


前面的博客中我也介绍过整型的存储方式,那这篇我们就来介绍一下浮点型的存储方式。



目录


浮点型的存储规则


存入规则


取出规则


例子


结语


浮点型的存储规则


根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

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


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

(2)M表示有效数字,大于等于1,小于2。

(3)2^E表示指数位。

存入规则



IEEE 754




规定:


对于


32


位的浮点数,最高的


1


位是符号位S


,接着的


8


位是指数


E


,剩下的


23


位为有效数字


M




对于64


位的浮点数,最高的


1


位是符号位S


,接着的11


位是指数


E


,剩下的52


位为有效数字


M





IEEE 754




对有效数字




M




和指数




E




,还有一些特别规定。


M的范围为:



1≤M<2



,也就是说,


M


可以写成


1.xxxxxx


的形式,其中


xxxxxx


表示小数部分。

IEEE 754


规定,在计算机内部保存


M


时,

默认这个数的第一位总是




1



,因此可以被

舍去

,只保存后面的 xxxxxx部分。比如保存


1.01


的时候,

只保存01



,等到读取的时候,再把第一位的


1


加上去。这样做的目的,是节省


1


位有效数字。以


32


位 浮点数为例,留给M


只有


23


位,

将第一位的


1


舍去以后,等于可以保存


24


位有效数字。


至于指数




E




,情况就比较复杂。



首先,




E




为一个无符号整数(




unsigned int







这意味着,如果


E





8


位,它的取值范围为


0~255


;如果


E





11


位,它的取值范围为


0~2047


。但是,我们 知道,科学计数法中的E


是可以出现负数的,所以IEEE 754


规定,存入内存时


E


的真实值必须再加上一个中间数,

对于




8


位的


E


,这个中间数是127





对于




11


位的


E


,这个中间



数是


1023



。比如,


2^10





E





10


,所以保存成


32


位浮点数时,必须保存成


10+127=137


,即

10001001




取出规则



E




不全为




0




或不全为




1


这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将 有效数字M前加上第一位的1。

比如:

0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为

1.0*2^(-1),其阶码为-1+127=126,表示为

01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:                                       0   01111110    00000000000000000000000

(S)      (E)                            (M)



E




全为




0


这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于 0的很小的数字。



E




全为1


这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)


例子

当在编译器中的内存窗口查看时,内存窗口的第一行就是a的地址也就是5.5在内存中的形式,


结语

这一篇文字会比较多,只要认真看、认真思考是可以理解的,学这些知识也是在完善自己,所以尽管用到的地方不多,但是还是要了解一下。



版权声明:本文为m0_64607843原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。