深入理解浮点数:阶码为什么要加上偏移量等4个问题

1. 为什么阶码要加上偏移量127或1023呢?

我们知道,浮点数的表示分为三部分:数符、阶码、尾数。
在这里插入图片描述

在这里插入图片描述

其中阶码并非直接存储科学计数法的指数(如上图的指数6),而是会加上偏移(存储的是133,由6+127计算得来)。对于单精度浮点数,阶码部分占8位,偏移量为127;而对于双精度浮点数,阶码部分占11位,偏移量为1023。

为什么要这样设计呢?

下面以单精度浮点数为例进行说明。

①将阶码转换为无符号整数,简化硬件实现

要理解这点,有几个关键:

  • 二进制数的阶码有正有负,就像十进制的指数一样
  • 单精度阶码有8位,相当于一个byte,理论上能表示的数据范围是-128~127
  • 实际上我们规定阶码的范围是-126~127,有正有负,加上偏移量127后的范围是1 ~ 254,变成了无符号整数,就不用考虑正负号了

总之,加偏移量后,指数可以表示为无符号整数,这简化了硬件的设计和运算逻辑。如果不使用偏移量,负指数需要特别处理,增加了硬件实现的复杂度。通过偏移,所有的指数都可以用统一的方式处理,无论是正数还是负数。

②避免阶码特殊值0和255

为什么不偏移量定位为128呢?

毕竟8位阶码理论上能表示的范围是-128 ~ 127,加上偏移量之后范围是0 ~ 255,也能把阶码变成无符号整数。

这是因为IEEE754对阶码为0和阶码为255时,做了特殊规定,阶码范围定位为-126 ~ 127、偏移量定为127恰好能避开这两个特殊的值:

在这里插入图片描述

2. 有小数点位置可变的浮点数,有没有小数点位置不变的定点数呢?

确实存在,那就是定点数,Java没有定点数的实现。

与浮点数相比,定点数的小数点位置是固定的,这意味着其表示的数值范围相对有限,但每个数值的精度是确定的。定点数在早期的计算机系统中非常常见,尤其在对成本敏感或对速度有严格要求的嵌入式系统中仍被广泛应用。

定点数的表示形式通常包括整数部分和小数部分,但两者之间的比例是固定的。例如,一个16位的定点数可能前8位表示整数部分,后8位表示小数部分,这样就决定了它的数值范围和精度。定点数的运算相对简单,不需要复杂的浮点运算单元(FPU),因此在资源受限的环境中非常有用。

3. 单精度和双精度的“单”、“双”是怎么来的呢?

其实非常简单,“单精度”(Single Precision)占用了32个字节,“双精度”(Double Precision)占用64个字节,后者是前者的2倍,是单、双的关系。“单”和“双”并没有非常明确的指向,仅仅表示了精度的不同。

4. 既然浮点数会损失精度,为什么计算机还要采用这种表示方法呢?

尽管浮点数运算存在精度损失的问题,但它仍然是现代计算机系统中不可或缺的一部分,原因如下:

广泛的数值范围

浮点数能够表示从极小的数(接近0)到极大的数(接近无穷大),这是任何固定大小的定点数都无法比拟的。这对于科学计算、工程应用、金融分析等领域至关重要,这些领域经常需要处理跨越多个数量级的数据。

动态调整精度

浮点数的小数点位置可以根据数值的大小动态调整,自动适应不同规模的计算需求。这意味着,在大多数情况下,即使有精度损失,也能保证计算结果在可接受的误差范围内。

硬件支持

现代处理器普遍内置了浮点运算单元(FPU),专门用于高效地执行浮点运算。虽然存在精度问题,但硬件加速大大提升了浮点运算的速度,使得许多复杂的算法和应用成为可能。

实用性与便利性

浮点数的使用简化了编程,程序员无需担心数值范围限制或手动调整数值精度,这使得软件开发更加高效和灵活。

总之,尽管浮点数的精度损失是一个现实问题,但其广泛的应用范围、动态的精度调整能力以及硬件层面的支持,使其成为处理实数运算不可或缺的工具。通过理解和合理规避精度损失,我们能够在保持计算效率的同时,确保计算结果的准确性。

  • 34
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值