一文读懂计算机浮点存储的秘密

 

前言

  我们知道float类型占4个字节,long类型占8个字节,但是与“常识”相反的是:float的存储范围要比long的存储范围大,64位的long类型可以自动转换成32位的float类型(存在精度丢失可能)。

  • 为什么float是32位的,但表示的数值范围比64位的long还大?
  • 计算机又是如何存储浮点数的?

  如果你有困惑,那一起来了解下浮点数和IEEE754吧!


 

一、浮点数

1.浮点数的表示形式

  浮点数,见名知意,小数点位置不固定的数。在计算机中,根据小数点是否固定将数据分为浮点数和定点数。

官方回答:以适当的形式将比例因子表示在数据中,让小数点的位置根据需要进行浮动。

浮点数表示为: N = rE * M

<span style="color:#000000"><code>r是浮点数阶码的底,与尾数的基数相同,通常r=2。E和M都是有符号的定点数,E称为阶码,M称为尾数。
</code></span>

在计算机中表示一个浮点数时,

  • 给出尾数M,用小数形式表示;
  • 给出指数E,用整数形式表示,常称为阶码

尾数部分给出有效数字的位数,决定浮点数的表示精度;
阶码部分指明小数点在数据中的位置,决定了浮点数的表示范围

 

2.浮点数的规格化

      为了提高运算的精度,需要充分利用尾数的有效位数,通常采取浮点数规格化形式,既规定尾数的最高数位必须是一个有效值。非规格化浮点数需要进行规格化操作才能变成规格化浮点数。所谓规格化操作,是指通过调整一个非规格化浮点数的尾数和阶码的大小是非零的浮点数在尾数的最高位数上保证是一个有效值。

25 *1.10101
左规一次得到规格化形式: 24 *1.0101


 

二、IEEE754标准

按照IEEE754标准,常用的浮点数的格式如下图所示
在这里插入图片描述


IEEE754规定的常用格式有单精度浮点数、双精度浮点数和临时浮点数(不做讨论),见下表。

类型数符阶码尾数数值总位数最大指数最小指数偏置值
单精度182332+127-126127
双精度1115264+1023-10221023
临时浮点数1156480+16383-1638216383

 

  IEEE754标准的浮点数,是尾数用采取隐藏位策略的原码表示,且阶码用移码表示的浮点数。

  以float浮点数为例,最高位为数符位;其后是8位阶码,以2为底,用移码表示,阶码的偏置值为28-1-1=127;其后23位是原码表示的尾数数值位。对于规格化的二进制浮点数,数值的最高位总是“1”,因此尾数数值实际上是24位 ,隐含的“1”是一位整数。在浮点格式中表示的23位尾数是纯小数。例如,(12)10=(1100)2,将它规格化后结果为1.1×23,其中整数部分的“1”将不存储在23位尾数内。

根据浮点数的规格化方法,尾数域的最高有效位总是1,该标准约定这一位不予存储,而是认为隐藏在小数点的左边,所以,尾数域所表示的值是1.M(实际存储的是M),这样可使尾数的表示范围比实际存储多一位。

 

  存储浮点数阶码部分之前,偏置值要先加到阶码真值上。上例中,阶码值为3,因此在float浮点数中,移码表示的阶码为127+3=130(82H);若在double浮点数中,阶码则为1023+3=1026(402H)。

阶码用移码的原因:移码可以直观地看出数的大小,这样就使得浮点数加减法操作起来更方便。当然,此时需要在阶码真值上加上一个偏移量。

 

相应的,在IEEE754标准中,规格化浮点数的真值为:

(-1)s * 1.M *2E-127

<span style="color:#000000"><code> 式中s=0表示正数,s=1表示负数;E的取值为1~254(8位),M为23位,共32位。
</code></span>

 

空出8位全为1来表示无穷大;阶码值E的范围是1~254,空出全0表示非规格化数。


 

三、我们回归到最开始的问题

1. 为什么float是32位的,但表示的数值范围比64位的long还大?

  我想你已经有答案了。float型有指数部分,规约数的指数可以表示到2127,差不多是1038那么大。
  从信息论的角度看,有了IEEE 754对编码格式的规定,我们知道哪个是符号位,哪些是指数部分,哪些是小数部分,以及省略的最高位的1,所以float型32个bit才能存下这么多信息。

2.计算机如何存储浮点数?

比如十进制的11.0,写成二进制就是1011.0,
用IEEE标准表示:(-1)0 × 1.011 × 23 ,s=0,M=1.011,E=3。

那么,计算机是如何存储s,M,E这三个值呢?
可以理解存储格式为:SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

所以,如果按单精度(32位)浮点数存储,计算机会在内存中开辟一个32位的存储空间,最高1位保存0,中间8位保存E+127,最后23位保存M的小数部分

转载:https://blog.csdn.net/weixin_44465396/article/details/112600638

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值