Appearance
题目
已知用 IEEE 754 单精度浮点数表示浮点型变量,采用就近舍入(中间值取偶数)。若浮点型变量 x 为 12.1,则 x 的机器数是( )。
错因
A
阶码、规格化都做对了,但舍入做成了截断——把第 23 位以后的尾数直接砍掉,得到尾数 100 0001 1001 1001 1001 1001。题目明说"就近舍入(中间值取偶数)",被舍部分是 1 1001100...(最高位是 1 且后面非零),按"四舍六入"应进位(加 1),最低位从 1001 变成 1010,得到 999A 而非 9999。
C
整数部分二进制位数算错——把 12 当成了 5 位 11100B 而不是 4 位 1100B,导致规格化时多挤了一位。这样 12.1 被错误地写成 1.1100 0000 1100 1100 ... × 2^4(其实表示的是 28.1 附近的值),阶码 = 4 + 127 = 131 = 1000 0011,机器数前 12 位变成 0100 0001 1110 0000 = 41E0,后续尾数照搬 0.1 的循环节但少了截断处理。
D
错误源同 C(把 12 当成 11100B);另外舍入这一步注意到了"应进位",所以末位从 CCCC 变成 CCCD。整数转二进制写错位数是浮点题最隐蔽的坑——12 = 8+4 = 1100B(4 位),不是 11100B(5 位),后者代表 28。
总解析
IEEE 754 单精度格式(共 32 位):
- S:1 位符号位(0 正 1 负)
- E:8 位阶码(移码,偏移量 127)
- M:23 位尾数(隐含前导 1)
第一步:把 12.1 写成二进制
整数部分 12 = 1100B(4 位)。
小数部分 0.1 不能精确表示,是无限循环二进制:
| 运算 | 结果 |
|---|---|
| 取 0 | |
| 取 0 | |
| 取 0 | |
| 取 1 | |
| 取 1 | |
| 取 0 | |
循环节为 0011 |
所以 (首位 0001 后无限循环 0011)。
合起来:。
第二步:规格化
把小数点左移到最高位 1 后面:
尾数小数点后从左数第 23 位的截止位置:
位号: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 24 25 ...
尾数: 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 | 1 0 0 1 1 ...第 23 位(最低位)是 1,第 24 位起的"被舍部分" = 1 0011 0011 ...(首位是 1,后续非零)。
第三步:就近舍入
| 被舍部分形态 | 舍入动作 |
|---|---|
| 首位 = 0 | 直接截断(向下) |
| 首位 = 1,后续非零(> 中间值) | 向上进位(最低位 + 1) |
| 首位 = 1,后续全 0(恰好中间值) | 偶数舍入:使最低位为 0 |
本题被舍部分 1 0011... 后续非零 → 向上进位:
尾数最终:100 0001 1001 1001 1001 1010
第四步:拼装 32 位
| 字段 | 计算 | 二进制 |
|---|---|---|
| 符号位 S | x = 12.1 > 0 | 0 |
| 阶码 E | 真阶 3 + 偏置 127 = 130 | 1000 0010 |
| 尾数 M | 上一步的进位结果 | 100 0001 1001 1001 1001 1010 |
合并:
0 | 1000 0010 | 100 0001 1001 1001 1001 1010按 4 位重新分组:
0100 0001 0100 0001 1001 1001 1001 1010
= 4 1 4 1 9 9 9 A机器数 = 4141 999AH。
最终答案是 B(4141 999AH)。
关键易错点:
- 12 =
1100B(4 位),不是11100B(5 位)——位数算错全盘错 - 0.1 是无限循环
0001 1001 1001 ...,循环节是 0011,不是 1100 - 就近舍入时被舍部分是
1xxxx...且至少一位非零 → 进位;不是简单地"看第 24 位是 1 就进"