表现形式:
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)。
为什么是小的尾数右移?
按数值大小,整体结果更多地“取决于大数”,所以更应该保护大数的尾数精度。
浮点尾数位数有限,往左移越多,越容易溢出尾数位数,后面的位被截断或舍入,导致大数本身的精度大量损失。
浮点乘除
符号异或,阶码相加(减偏置),尾数相乘,规格化+舍入。
符号异或,阶码相减(加偏置),尾数相除,规格化+舍入。