1. 运算步骤 (The Pipeline)
浮点运算比整数复杂得多,无法在一个周期内完成。通常分为 5 步:
- 对阶 (Align Exponents):
- 核心原则:小阶看齐大阶。
- 操作:阶码小的数的尾数右移,直到阶码相等。
- 代价:精度丢失(小树的低位被移出)。
- 尾数加减 (Add/Sub Mantissas):
- 执行定点加减运算。注意隐含的 “1”。
- 规格化 (Normalize):
- 左规:结果太小 (0.001…),尾数左移,阶码减。
- 右规:结果太大 (10.1…),尾数右移,阶码加。
- 溢出检查:阶码上溢 (Overflow) ;阶码下溢 (Underflow) 。
- 舍入 (Round):
- 因为对阶或右规导致了位数丢失,需要根据 IEEE 754 规则舍入 (就近舍入、朝0舍入等)。
- 保护机制:运算过程中会多保留几位 (保护位 Guard bit, 舍入位 Round bit, 粘位 Sticky bit) 以保证最后舍入的精度。
- 符号位处理。
2. 精度与漏洞 (Precision & Bugs)
- 大数吃小数:由于对阶机制,如果一个巨大的数 (e.g., ) 加一个很小的数 (e.g., ),小树的尾数会全部被移出,导致加法无效。
- 场景:在循环累加中,必须先加小数,再加大数。
- 非结合律:浮点数加法不满足结合律 。这对科学计算和金融计算是灾难。
3. MIPS 浮点指令
- MIPS 有独立的浮点寄存器堆 (
$f0-$f31) 和协处理器 (Co-processor 1)。 - 这说明浮点运算和整数运算在硬件上是物理隔离的。
4. 期末生存指南 (Exam Survival)
- 计算题流程:
- 转二进制 (注意 IEEE 754 格式)。
- 求阶差 。
- 对阶 (移尾数)。
- 尾数加减。
- 规格化 (重中之重,别忘了调整阶码)。
- 判断溢出。