浅谈浮点型数据在内存中的存储

浮点型数据共有两种:单精度浮点型float和双精度浮点型double

根据IEEE的957标准,任何一个二进制浮点数,也就是二进制小数,可以写成如下的形式: 

其中S的取值为0或1,用来标识该浮点数的正负

M为二进制表示时的有效数字,1<=M<2

E为2的指数,可以类比为科学计数法中10的指数

以下举一个具体例子:

所以,浮点数在内存中的存储,实际上存储的就是S、M和E这三个值。那具体是如何存储呢?

对于单精度浮点型而言:

大小为4个字节,共32个比特位

按照高位到低位的顺序,最高位(32位)存储的是S,之后8位存储的是E,后23位存储的是M。

对于双精度浮点型而言:

大小为8个字节,共64个比特位

按照高位到低位的顺序,最高位(32位)存储的是S,之后11位存储的是E,后52位存储的是M

S的存储无非就是存0或1,所以我们具体来讲一讲E和M的存储

E的存储:

计算机内存中默认存储的E是无符号整型,然而实际上E可正,可负,可为0。为了解决这种情况,存储到计算机内存中的E,是E的实际值再加上一个值,此值float 与 double 有所不同。

M的存储:

M在具体存储时,会将小数点前的1自动略去,这样可以节省一位有效数字位。在具体使用时,在将小数点前的1自动补上。

M存储时,在分配给M的二进制位上,从高位开始存储,有二进制位多余则自动填0

比如说,对于浮点数5.5而言,其M=1.011,设其为单精度浮点型,则计算机内存中存储的M是:

01100000000000000000000(共23个比特位,去1之后,补了20个0)

以上是浮点型数据在内存中的存储方式,那我们使用浮点型数据时,又是如何将其从内存中拿出的呢?

我们基于E在内存中存储的值,分为以下三种情况:

1、E在内存中存储的二进制数,不全为0,也不全为1。此时,S正常拿出,M拿出时补充小数点前省略的1,E则分情况讨论---单精度浮点型,E-127拿出;双精度浮点型E-1023拿出。

2、E在内存中存储的二进制数,全为0。此时,我们默认拿出的E,即E的实际值为-126(1-127)或-1022(1-1023)。而此时,我们拿出M时,不会在小数点前补1,而是默认小数点前为0。在这种情况下,这个浮点型数据就是一个无限趋近于0的数(正负取决于符号位S)。此时,如果打印该数据,输出的结果为0.000000。

3、E在内存中存储的二进制数,全为1.在这种情况下,E的实际值会很大,如果是float类型的数据,E的实际值为128(255-127)。所以,这样一个浮点数是一个非常非常大的数,可以理解为正负无穷大(正负取决于符号位S)

通过以上的探讨我们可以发现,浮点数在内存中的存储其实会存在无法精确存储的问题。因为本质上,对于某些浮点型数据而言,有效数字M是可以精确得到的;但对于有些浮点型数据而言,有效数字M只是一个近似值,一个逼近值。而对于这种类型的浮点数,double的精度就要高于float,因为double中M有52位,可以更逼近真实值,而float中M只有23位。

但是,无论是double还是float,本质上都是存在精度的问题的,即在某些情况下,无法做到百分百准确表示,只不过double的精度要比float更高罢了。

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值