本页格式:共 11 位 = 阶码区 4 位 + 尾数区 7 位。
完整计算流程(5 步)——设要算真值 X:
| 步骤 | 做什么 | 例子(X = 5.25) |
|---|---|---|
| 1 | 十进制 → 二进制 整数:除2取余倒着读|小数:乘2取整顺着读 | 5.25 → 101.01 |
| 2 | 规格化:挪小数点成 0.1xxx挪几位,阶码 E 就是几 | 0.10101 × 2³,E=3 |
| 3 | 算阶码:E + 8 后转 4 位二进制 不够 4 位左边补 0(偏移量恒为 8) | 3+8=11 → 1011 |
| 4 | 算尾数:数符 + 小数部分 正0负1;小数不够 6 位右边补 0 | 0 + 101010 = 0101010 |
| 5 | 两段拼起来 | 1011 0101010 |
补 0 往哪边?一句话:小数右补、整数左补(往"权值小、不影响数值"的那边补)。
| 要补的部分 | 方向 | 为什么 |
|---|---|---|
| 二进制小数、尾数小数位 | 右补(末尾) | 右边权值趋近 0(1/64…),补 0 不加值 |
| 二进制整数、阶码转位 | 左补(最前) | 左边是高位,补 0 只补位不加值 |
| 码制 | 正数 | 负数 |
|---|---|---|
| 原码 | 符号0 + 绝对值 | 符号1 + 绝对值 |
| 反码 | 原=反=补(不变) | 数值位取反,符号位仍为 1 ⚠️ |
| 补码 | 原=反=补(不变) | 反码末位 +1 |
1 0101101 → 反 1 1010010 → 补 1 1010011中学学过的科学计数法,就是浮点数的“祖先”:
它的好处是:不管数多大、多小,都能写成“一个小数 × 10 的几次方”。
浮点数,就是“二进制版的科学计数法”。公式只有一个:
你在上一页学的定点数,小数点是钉死的。它像一根只有 8 格的尺子:
结果就是:量不了 888 这种大数,也量不了 0.00002 这种小数,一算就“装不下”(溢出)。
浮点数的思路是:让小数点可以移动(浮动的点 → 浮点数)。小数点往左移几位,指数就加几,数值不变,但能覆盖的范围一下子变得极大极小。
一个浮点数,拆成 4 段(下面是本页用的 11 位示例,先看结构、别管细节):
其实就是把科学计数法搬过来:
| 科学计数法里的 | 对应格子 | 负责什么 |
|---|---|---|
| 10 的 指数 | 阶符 + 阶码 | 范围:能表示多大 / 多小 |
| 尾数(1.2345 那部分) | 数符 + 尾数 | 精度:有效数字有几位 |
科学计数法里,12345 能写出无数种形式,它们全都相等:
问题来了:同一个数这么多写法,计算机到底存哪一种? 乱套了。
所以定一个唯一标准写法:让小数点后面第一位必须是有效数字。这个“调成唯一标准写法”的动作,就叫 规格化。
0.056 × 10³ 是规格化写法吗?为什么?5.6 × 10¹(第一位变成有效数字 5)。
上面的道理都懂了吗?懂了就点下面的按钮,我们进入二进制世界,看 5.25 这种数是怎么一步步变成 阶码 + 尾数 的 👇
二进制的有效数字只有 0 和 1,「有效数字」就是 1。所以二进制规格化的规则特别干脆:
0.1xxx 形态),挪了几位,阶码就是几。注意:0.1xxx 要同时满足 ①小数点前没有数字 且 ②小数点后第一位是 1,两个条件缺一不可。
拿 5.25 演示,全程两件事:①整数小数各转二进制 ②挪小数点。
⚠️ 别被 10.101 骗了:它小数点后第一位已经是 1,但小数点前还有 10,所以 不算规格化,要继续挪。只看"小数点后第一位"会在这里早停!
停下来:0.10101 × 2³ 就等于 5.25(把小数点移回去验证一下:0.10101 右移 3 位 = 101.01 = 5.25 ✓)。
42 的阶码和尾数分别是多少?(提示:42 = 101010₂)选一个真值,然后一直点 下一步,它会带你走完这 6 步:
| 步骤 | 在做什么 | 对应上面哪个道理 |
|---|---|---|
| ① 十进制→二进制 | 算出 101.01 这种形式 | ⑤ 第一步 |
| ② 规格化 | 挪小数点成 0.10101 × 2³ | ⑤ 第二步 |
| ③ 求阶码 | 把 E=3 用「移码」写成 4 位 0/1 | 阶码管范围 |
| ④ 求尾数 | 把 0.10101 用「补码」写成 7 位 0/1 | 尾数管精度 |
| ⑤ 拼起来 | 阶码 + 尾数 = 11 位 0/1 | ③ 的四个格子 |
| ⑥ 反向校验 | 读回去看等不等于原数 | 验收 |
⚠️ 两个“反例”按钮特别看:+0.1(尾数 6 位装不下 → 舍入,有误差)和 +200(阶码装不下 → 溢出)。
0.1xxx(第一位是 1)1.0xxx(第一位是 0)0.01xxx、1.1xxx → 未规格化,需左移K = 大阶 − 小阶,把阶小的数尾数右移 K 位、阶码加 K(小阶向大阶看齐)。右移会丢低位 → 有精度损失。176.0625 = 10110000.0001₂1.01100000001 × 2⁷(隐含小数点前那位 1,即尾数 = 1.xxx)127 → 7 + 127 = 134 = 10000110₂(注意:用 127 不是 128)01100000001 0000000000000
| 参数 | 单精度 | 双精度 | 扩充精度 |
|---|---|---|---|
| 总字长 | 32 | 64 | 80 |
| 符号位 S | 1 | 1 | 1 |
| 指数长度 E | 8 | 11 | 15 |
| 尾数长度 P | 23 | 52 | 64 |
| 指数偏移量 | +127 | +1023 | +16383 |
| 可表示范围 | 10⁻³⁸~10³⁸ | 10⁻³⁰⁸~10³⁰⁸ | 10⁻⁴⁹³²~10⁴⁹³² |
0 和极接近 0 的数)NaN