浮点数加减运算是计算机中最复杂的算术运算之一,核心步骤为:对阶 → 尾数运算 → 规格化 → 舍入 → 溢出判断。
输入:$X = M_x \times 2^{E_x}$,$Y = M_y \times 2^{E_y}$
| 字段 | 说明 | IEEE 754 单精度 | IEEE 754 双精度 |
|---|---|---|---|
| 符号位 S | 0 正 1 负 | 1 位 | 1 位 |
| 阶码 E | 移码表示 | 8 位 | 11 位 |
| 尾数 M | 原码表示 | 23 位 | 52 位 |
| 步骤 | 说明 |
|---|---|
| 求阶差 | $\Delta E = E_x - E_y$ |
| 对阶原则 | 小阶向大阶看齐(阶码小的尾数右移) |
| 右移位数 | $|\Delta E|$ 位 |
| 阶码调整 | 小的阶码增大到与大的相同 |
| 类型 | 条件 | 操作 |
|---|---|---|
| 左规 | 尾数非规格化(如正数 0.0xxx... 或负数补码 1.1xxx...) | 尾数左移,阶码减 1 |
| 右规 | 尾数溢出(如 1x.xxxxx) | 尾数右移,阶码加 1 |
| 规格化形式 | 0.1xxxx...(正数)或 1.0xxxx...(负数补码) | — |
| 情况 | 条件 | 结果 |
|---|---|---|
| 阶码上溢 | 阶码 > 最大正值 | 正溢出/负溢出(异常) |
| 阶码下溢 | 阶码 < 最小负值 | 结果为 0(机器零) |
| 正常 | 阶码在正常范围内 | 正常结果 |
题目:设浮点数格式:阶码 4 位(移码),尾数 8 位(补码)。计算 $X + Y$:$X = 0.1101100 \times 2^{011}$,$Y = 0.1011000 \times 2^{001}$。
步骤 1:对阶
步骤 2:尾数加法
0.1101100 (X的尾数) + 0.0010110 (Y的尾数) ----------- 1.0000010 (结果)
步骤 3:规格化
步骤 4:舍入:此处无舍入问题。
步骤 5:溢出判断:阶码 = 100(即 4),无溢出。
结果:$0.1000001 \times 2^{100} = 0.1000001 \times 2^4$(规格化后)。
$X = 0.1100000 \times 2^2$,$Y = 0.1010000 \times 2^2$:阶码相同无需对阶;尾数相加 $0.1100000 + 0.1010000 = 1.0110000$ 溢出,右规:尾数右移 1 位、阶码加 1,结果 $0.1011000 \times 2^3$。
$X = 0.1010000 \times 2^3$,$Y = 0.1001000 \times 2^3$:尾数相减 $0.1010000 - 0.1001000 = 0.0001000$ 前导零过多,左规:尾数左移 3 位、阶码减 3,结果 $0.1000000 \times 2^0$,未下溢。
阶码 8 位(移码,偏置值 127),某次运算后阶码 = 11111111(255):真值 $= 255 - 127 = 128$,超过单精度阶码范围 -126 ~ +127,阶码上溢,结果为 $\pm\infty$。
$X = 0.1 \times 2^5$,$Y = 0.1000000001 \times 2^1$,尾数 8 位:对阶 Y 尾数右移 4 位得 $Y' = 0.00001000 \times 2^5$(低位丢失),对阶可能造成精度损失,所以小阶向大阶看齐(减少移位次数)。
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。