IEEE 754浮点数表示及浮点数转换全解

本文详细解析了浮点数的表示方法,包括单精度和双精度浮点数的构成,以及如何通过公式计算浮点数的具体值。还介绍了归一化偏置的概念及其在保证数值分布均匀性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本上我们记住几个公式就行了(蓝色字体公式)。

第一:浮点表示形式: N=|s|  E  |         M         |    。 单精度:s=1位,E=8位,M=23位。 双精度 s=1位,E=11位,M=52位,其中,E,M都为无符号数

第二:bias=2^{k-1}-1, bias是归一化偏置值,或模,代表指数E所能表达的最大值,k是E的位数。它的作用是将浮点数的值分布向0的方向靠拢,本来2^E是指数函数,函数值在E增大时急剧增大。非常不均匀。2^(E-bias)则使这个值进一步减小,在相同的大E时,函数值不会急剧增大,从而保证了浮点数的分布更均匀一点。实际上整个浮点数的分布都不是均匀的,E越接近于1跳跃越小。E=1和=0时的跳跃是相同的,都是最小精度。从e>M的位数开始,n的值将会以相邻两个浮点数(精度)>1的速度增加。E/e越大的,跳变越大。所以在此时最好不要用浮点数来存储,结果将会很不精确(1的数量级以上近似)。所以e=E-bias的作用就是在E较大时降低浮点数的分布密度。

第三:浮点数由这个公式计算得到(N->n): n=(-1)^{s}\times m\times 2^{e},或称浮点表示也可以由此公式反推出来(n->N)。

先看从n->N的过程:

     整数和小数部分分别转化为二进制,然后合在一起。整数部分:除2取余法,从下往上数。小数部分:乘2取整法,从上往下数。如2.5=10.1,它并不是规范形式,规范要求m必须为1.M或0.M形式。所以必须先进行规格化。再求M,E。

分成3种情况:

  1. 将m转化n=1.M*2^e这种形式,又分两种情况,
    1. e\geqslant 1-bias如:1.01*2^1。对应于m=1.M,只存储归一化有效数字部分M,隐含整数位不存储,需要按照e=E-bias,调整指数E=e+bias(增加偏置)。如n=10.1=1.01\times 2^{1}=(-1)^{s}\times m\times 2^{e},然后得s=0,m=1.01=1.M, e=1。从而M=01(存储时需补齐后面的0),e=1=E-bias, 所以E=1+bias=128。
    2. e<1-bias时,应用特殊格式m=0.M格式,应按照m的格式重新调整n=(-1)^{s}\times m\times 2^{e},且使E=0, M转化为二进制存储,若位数不足,则溢出。如:5.877472e-39=5.877472\times 10^{-39}\times 2^{126}\times 2^{-126}=0.500000021\times 2^{-126}=(0.1)_{2}\times 2^{-126},所以m=0.M,M=1, E=0。如果按照m=1.M格式,5.877472e-39=(0.1)_{2}\times 2^{-126}=(1.0)_{2}\times 2^{-127},将导致e=-127<1-bias。
  2. 特殊数:+∞:s=0,E=全1,M=全0;

                    -∞:s=1,E=全1,M=全0;

                    +0:s=0,E=全0,M=全0;

                    -0:s=1,E=全0,M=全0;

                    NaN(不是数):s=1/0,E=全1,M=不全0;

看看从N->n的过程:

    先看E,M,分别求的e,m,再运用n=....的公式计算最终值。也分为3种情况:

  1. E=0, 分两种情况:
    1. M<>全0,0.M=m格式,e=1-bias。n=(-1)^{s}\times m\times 2^{e},这里需要将m转化为10进制,使用我把它称之为加余除二法的方法(从2进制小数末位开始每位作为余数加到除数上(开始除数为0)依次除2所得最终结果,每次除完结束),或加权求和法(每位小数乘2的负幂次,再求和)。还可以将小数转化为整数*2^-o, 再用加余乘2法的方法(从2进制整数最高位开始每位作为余数加到乘数上(开始乘数为0)依次乘2所得最终结果,每次加完计算结束)。也可以用加权求和法。
    2. M=全0, n=0;根据s,判断+/-0。
  2. E>=1, 1.M=m,e=E-bias。n=(-1)^{s}\times m\times 2^{e},仍然需要将m转化为10进制,使用上面a所示方法。
  3. E=全1,两种情况:
    1. M=全0,n=∞,根据s,判断+/-∞。
    2. M=不全0,n=NaN (不是一个数)

是不是很和谐呢!是不是很简单呢!这就是计算机科学家必须理解的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值