Administrator
发布于 2025-12-17 / 5 阅读
0

02-浮点数

表现形式:

X=(-1)^S\times M \times R^E

其中 S 表示 sign 即符号位。M 表示 Mantissa 一般是一个有符号小数,尾数。 R 为基数Radix,计算机中一般为2,科学计数法为10。E 表示 Exponent,阶码表示小数点移动的量。

与定点数比较

  • 定点数:小数点位置固定,表示形式简单,机器只能表示某一个区间内的数,大小范围较小。
  • 浮点数:小数点位置不固定,可以有大动态范围,用“阶码”表示小数点移动,可以表示极大和极小的数,适合科学计算。

阶码决定范围,尾数决定精度

规格化浮点数

规格化的作用

  • 同一个数只有一种写法(避免多种等价表示)
  • 尾数利用得最充分(最高位非零,不浪费精度)

规格化是什么

M 满足一定条件。

一般来说是:

\frac{1}{R} \le |M| < 1 \text{或者} 1 \le |M| < R

有什么影响

  • 对一个给定位数的浮点格式:
    • 阶码位数越多 → 可表示的 数值范围 越大;
    • 尾数位数越多 → 有效数字越多,精度越高
  • 规格化本身不会增加位数,但保证:
    • 在给定尾数位数下,有效数字尽量多
    • 对于同一阶码,能表示的数尽可能“密”。

可表示的最大数和最小数

取决于:符号数(0还是1),M 的表示(全0或全1),E (最小是全0,最大是全1)
具体看题。

阶码偏置

为什么要

  • 需要方便的比较大小(1111>1110 但是 0001<0011 涉及到最高位分类讨论,编码难度增加)。而如果都是无符号数,可以简化比较的编码。
  • 浮点数运算的时候,需要先“对阶”。无符号数这一步更方便。

怎么实现

就是整体偏置(+Bias
一般就是,把表示范围从 [-2^{k-1} + 1, 2^{k-1}] \rightarrow [0,2^k-1]
故,Bias = 2^{k-1}-1
实际存储的值 E'=E+Bias,E'\ge 0
真实使用的值 E=E'-Bias

浮点数加减

步骤:

  • 对阶:
    • 比较两个数的阶码,大的保持不变;
    • 小的那个尾数右移(基数为 R 时每移一位阶码 +1),直到阶码相同。
  • 尾数运算:
    • 符号相同:尾数相加;
    • 符号不同:尾数相减,并确定结果符号。
  • 规格化结果尾数
  • 舍入与溢出处理:
    • 超出尾数位数的部分,根据“截断/舍入”等规则处理;
    • 若阶码超过允许范围,发生上溢(Overflow)或下溢(Underflow),需按格式规定处理(如置成最大数/0)。

为什么是小的尾数右移?

按数值大小,整体结果更多地“取决于大数”,所以更应该保护大数的尾数精度。
浮点尾数位数有限,往左移越多,越容易溢出尾数位数,后面的位被截断或舍入,导致大数本身的精度大量损失。

浮点乘除

符号异或,阶码相加(减偏置),尾数相乘,规格化+舍入。
符号异或,阶码相减(加偏置),尾数相除,规格化+舍入。