Appearance
浮点数表示(IEEE 754)
大纲定位
二(四)1 浮点数的表示:IEEE 754 标准
要求:掌握单精度/双精度的字段划分与偏置值,能在机器数与真值之间双向转换,识别规格化数、非规格化数与三类特殊值,并知道表数范围与精度各由谁决定。
浮点数的加/减运算(对阶、尾数运算、规格化、舍入)见 浮点数运算。
考情分析
这一节的题绝大多数是同一件事的正反两面:给十六进制求真值、给真值求十六进制。会做这两个方向,一半的分就到手了。剩下一半分散在四处——非规格化数、舍入、表数范围、精度够不够——每一处都只有一两句话的知识量,但没见过就一定不会。下面按这个顺序讲。
浮点数的一般格式
:符号位(0 正 1 负) :阶码(指数),决定表示范围 :尾数(有效数字),决定精度
总位数固定时,阶码位数越多范围越大、尾数位数越多精度越高,两者此消彼长。
IEEE 754 标准格式
| 字段 | 单精度 float(32 位) | 双精度 double(64 位) |
|---|---|---|
| 符号 | 1 位, | 1 位, |
| 阶码 | 8 位, | 11 位, |
| 尾数 | 23 位, | 52 位, |
| 偏置值 bias | ||
| 有效位数 | 24 位(含隐含 1) | 53 位(含隐含 1) |
规格化数
尾数形式为
阶码范围
特殊值与非规格化数
| 阶码 | 尾数 | 含义 | 真值 |
|---|---|---|---|
| 全 0 | 正零负零,比较时相等 | ||
| 全 0 | 非规格化数 | ||
| 全 1 | 如 | ||
| 全 1 | NaN | 如 | |
| 其他 | 任意 | 规格化数 |
非规格化数的指数是
单精度非规格化数的真实指数固定为
原因:这样才能和最小规格化数无缝衔接。最大的非规格化数是
非规格化数的作用就是填补 0 到最小规格化数之间的空隙(渐进下溢)。
为什么阶码用移码
阶码使用移码(偏置码)而非补码,有两个好处:
- 比较大小可以直接按位模式比(见后文"浮点数怎么比大小")
- 全 0 阶码腾出来给零和非规格化数,全 1 腾给无穷和 NaN
十六进制 ↔ 真值:两个方向的固定流程
方向一:机器数 → 真值
- 十六进制展开成 32 位二进制
- 按 1 / 8 / 23 切开
- 先看阶码是不是全 0 或全 1——这一步决定走哪条公式
- 规格化数:
,尾数补上隐含的 1 - 写成
方向二:真值 → 机器数
- 把绝对值写成二进制(整数部分 + 小数部分)
- 规格化成
,转 8 位二进制 - 小数点后的位填进尾数字段,右边补 0 补满 23 位
- 拼成 32 位再转十六进制
常用二进制小数速查
考场上把要转的小数拆成这几个的和,比反复乘 2 快得多。
哪些数能被精确表示
判据只有一条:一个十进制小数能用有限位二进制小数精确表示,当且仅当它化成最简分数后,分母是 2 的幂。
| 数 | 最简分数 | 分母 | 能否精确表示 |
|---|---|---|---|
| 2.0 | ✓ | ||
| 2.5 | ✓ | ||
| 1.25 | ✓ | ||
| 0.4375 | ✓ | ||
| 1.2 | 5 | ✗ | |
| 0.1 | 10 | ✗ |
分母里只要含有 2 以外的质因子(5、3……),二进制展开就是无限循环的,只能截断存储。这就是 0.1 + 0.2 != 0.3 的根源。
判断技巧:看小数部分的分母。
这一族全是 2 的幂分母,能精确;凡是 这种十进制里"整"的,二进制里几乎都不整。
舍入
尾数放不下时必须舍入。IEEE 754 规定四种模式:
| 模式 | 规则 | 别名 |
|---|---|---|
| 就近舍入(中间值取偶) | 舍到最近的可表示数;正好在两个可表示数正中间时,取尾数末位为 0(偶数)的那个 | 默认模式 |
| 朝 | 总取数轴上右边那个可表示数 | 正向舍入、朝上舍入 |
| 朝 | 总取数轴上左边那个可表示数 | 负向舍入、朝下舍入 |
| 朝 | 直接截断丢弃多余位,取更靠近原点的那个 | 截断、恒舍法 |
就近舍入的实际操作分两种情况:
- 不是正中间(多数情况):就是普通的"0 舍 1 入"——看被丢弃部分是大于还是小于半个末位。
- 正好是正中间:此时"就近"无从选择,强制让结果的最低有效位为 0。若舍入后末位是 1,则末位加 1;否则不变。
别把"取偶"当成主规则
题面写着"就近舍入(中间值取偶数)"时,那只是在报模式名。绝大多数题里被丢弃的部分并不是恰好一半,取偶规则根本不会触发,你要做的就是普通的 0 舍 1 入。
先判断"是不是正中间",再决定用哪条。反过来就会算错。
表数范围与精度:四个数别混
这四个量长得像,问法只差几个字,答案完全不同:
| 问的是 | 单精度的答案 | 怎么来的 |
|---|---|---|
| 最小规格化正数 | ||
| 最小正数(含非规格化) | 非规格化最小: | |
| 最大正数 / 能表示的最大正整数 | ||
| 能精确表示的最大整数 | 有效位只有 24 位, |
第三行和第四行是两个完全不同的问题
- "能表示的最大正整数"问的是范围上限——答案是
,一个天文数字。 - "能精确表示的最大整数"问的是精度上限——答案是
,只有一千六百多万。
超过
浮点数怎么比大小
移码阶码的设计就是为了这件事:
- 先看符号位。
的一定大于 的( 除外)。 - 同为正数:直接把整个 32 位当无符号整数比,大的就大——因为阶码在高位、尾数在低位,字典序正好等于数值序。
- 同为负数:反过来——位模式作为无符号数越大,绝对值越大,值反而越小。
第 3 条是最容易翻车的。两个负浮点数,谁的阶码大谁的绝对值大,而绝对值大的那个更小。做题时先把两个数的符号和真实指数都写出来,再下结论,别凭感觉。
整数与浮点数的选型
题目给一个取值范围,问该用哪种类型——判断分两步:
- 范围够不够:
位补码整数的范围是 。 - 精度够不够:浮点数只有 24 位(单精度)/ 53 位(双精度)有效位,超过
/ 的整数就不能保证精确。
优先用整型
只要范围装得下,整数一定优于浮点数:精确、且运算快。只有范围装不下时才考虑浮点,此时还要检查有效位数够不够。
例如取值范围
关于 int 与 float 相互转换时具体丢什么,见 C 语言类型转换。
交互可视化
考场动作清单
拿到一道 IEEE 754 题,按这个顺序走:
- 展开成二进制,按 1/8/23 切开。
- 先看阶码:全 0 → 走非规格化公式(隐含位是 0,指数固定
);全 1 → 是 或 NaN;否则才是规格化数。 - 规格化数:
,尾数前面补回隐含的 1。 - 反方向(真值 → 编码)时,尾数右边补 0 补满 23 位再拼十六进制,别少补。
- 看清题眼:"能表示"还是"能精确表示","最小正数"还是"最小规格化正数"。
例题
例 1(机器数 → 真值,规格化):单精度机器数 4730 0000H,求真值。
解:展开 0100 0111 0011 0000 0000 0000 0000 0000
, - 尾数字段
,补回隐含 1 得
例 2(机器数 → 真值,非规格化):单精度机器数 8020 0000H,求真值。
解:展开 1000 0000 0010 0000 0000 0000 0000 0000
全 0 非规格化数,隐含位是 0,指数固定 - 尾数字段
,即
若忘了阶码全 0 这一步,会当成规格化数算出
——那正是准备好的干扰项。
例 3(真值 → 机器数):把
解:
, - 尾数字段
(补满 23 位)
拼起来 1 01111101 11000000000000000000000 = 1011 1110 1110 0000 0000 0000 0000 0000 = BEE0 0000H
例 4(舍入):采用就近舍入(中间值取偶),求
解:
规格化:
, - 取尾数前 23 位:
先写出截断结果:0 10000010 10000011001100110011001 = 4141 9999H
再看舍入:被丢掉的部分是
例 5(表数范围):单精度能表示的最大正整数是多少?最小规格化正数呢?
解:
- 最大:
,尾数最大
- 最小规格化正数:
,尾数最小 ,即
例 6(精确表示):
解:
例 7(比大小):两个 float 变量 CC900000H 和 B0C00000H,求它们的大小关系。
解:
| 符号 | 阶码 | ||
|---|---|---|---|
CC900000H | 1(负) | ||
B0C00000H | 1(负) |
两个都是负数,符号相同。
负数中绝对值大的更小,故
例 8(类型选型):整型参数
解:
: ,32 位整数装得下,精确且快。 : ,整数装不下。单精度范围虽够,但有效位只有 24 位, 量级的整数存不准。双精度有 53 位有效位, ,能精确表示。
答:
例 9(同一位模式两种读法):变量 int 或 float,机器数为 C800 0000H,
解:两种读法各算一遍。
- 按 int 补码读:最高位为 1,是负数。
- 按 float 读:
, , ,尾数字段全 0,得
两个候选值里,选项中出现的是
这类题的做法是固定的:两种解释都算出来,再去选项里对。别只算一种。
常见丢分点
- 忘了先看阶码是不是全 0——非规格化数用错公式,指数差一。
- 尾数没补满 23 位就去拼十六进制。
- 把"能表示的最大正整数"和"能精确表示的最大整数"搞混。
- 舍入时不判断是否正中间,直接套"取偶"。
- 两个负浮点数比大小时,把绝对值大的当成更大。
考点清单
- 单精度 1+8+23、偏置 127;双精度 1+11+52、偏置 1023
- 规格化数:隐含前缀 1,真值
- 非规格化数:阶码全 0,隐含前缀 0,指数固定
- 特殊值:全 0 阶码 →
/ 非规格化;全 1 阶码 → / NaN - 能精确表示
最简分数的分母是 2 的幂 - 四种舍入模式;就近舍入只有正中间时才用"取偶",否则就是 0 舍 1 入
- 最小规格化正数
;最大正数 ;能精确表示的最大整数 - 比大小:正数按位模式直接比;负数反过来,位模式大的值反而小
- 选型先看范围、再看有效位数;范围够就用整型
教材出处
- 袁春风《计算机组成与系统结构(第 3 版)》§3.2 浮点数的表示:IEEE 754 格式与规格化/非规格化数;§3.4 四种舍入方式与表 3.4 舍入示例(p83~84)