精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

浮点数表示(IEEE 754)

大纲定位

二(四)1 浮点数的表示:IEEE 754 标准

要求:掌握单精度/双精度的字段划分与偏置值,能在机器数与真值之间双向转换,识别规格化数、非规格化数与三类特殊值,并知道表数范围与精度各由谁决定。

浮点数的加/减运算(对阶、尾数运算、规格化、舍入)见 浮点数运算

考情分析

这一节的题绝大多数是同一件事的正反两面:给十六进制求真值给真值求十六进制。会做这两个方向,一半的分就到手了。剩下一半分散在四处——非规格化数、舍入、表数范围、精度够不够——每一处都只有一两句话的知识量,但没见过就一定不会。下面按这个顺序讲。

浮点数的一般格式

N=(1)S×M×2E
  • S:符号位(0 正 1 负)
  • E:阶码(指数),决定表示范围
  • M:尾数(有效数字),决定精度

总位数固定时,阶码位数越多范围越大、尾数位数越多精度越高,两者此消彼长。

IEEE 754 标准格式

字段单精度 float(32 位)双精度 double(64 位)
符号 S1 位,[31]1 位,[63]
阶码 E8 位,[30:23]11 位,[62:52]
尾数 M23 位,[22:0]52 位,[51:0]
偏置值 bias271=1272101=1023
有效位数24 位(含隐含 1)53 位(含隐含 1)

规格化数

尾数形式为 1.xxxx,最高有效位固定为 1,隐含不存储,白省一位精度。

真值=(1)S×1.M×2Ebias

阶码范围 1E254(单精度),即真实指数 126e127

特殊值与非规格化数

阶码 E尾数 M含义真值
全 0=0±0正零负零,比较时相等
全 00非规格化数(1)S×0.M×21bias
全 1=0±1/0
全 10NaN10/0
其他任意规格化数(1)S×1.M×2Ebias

非规格化数的指数是 1bias,不是 0bias

单精度非规格化数的真实指数固定为 126不是 127

原因:这样才能和最小规格化数无缝衔接。最大的非规格化数是 (1223)×2126,紧挨着最小规格化数 1.0×2126,中间不留空隙。如果用 127,两者之间就会断层。

非规格化数的作用就是填补 0 到最小规格化数之间的空隙(渐进下溢)。

为什么阶码用移码

阶码使用移码(偏置码)而非补码,有两个好处:

  1. 比较大小可以直接按位模式比(见后文"浮点数怎么比大小")
  2. 全 0 阶码腾出来给零和非规格化数,全 1 腾给无穷和 NaN

十六进制 ↔ 真值:两个方向的固定流程

方向一:机器数 → 真值

  1. 十六进制展开成 32 位二进制
  2. 按 1 / 8 / 23 切开
  3. 先看阶码是不是全 0 或全 1——这一步决定走哪条公式
  4. 规格化数:e=E127,尾数补上隐含的 1
  5. 写成 (1)S×1.M×2e

方向二:真值 → 机器数

  1. 把绝对值写成二进制(整数部分 + 小数部分)
  2. 规格化成 1.xxx×2e
  3. E=e+127,转 8 位二进制
  4. 小数点后的位填进尾数字段,右边补 0 补满 23 位
  5. 拼成 32 位再转十六进制

常用二进制小数速查

0.5=21=0.120.25=0.0120.125=0.00120.0625=0.00012

0.375=0.25+0.125=0.01120.4375=0.25+0.125+0.0625=0.011120.75=0.112

考场上把要转的小数拆成这几个的和,比反复乘 2 快得多。

哪些数能被精确表示

判据只有一条:一个十进制小数能用有限位二进制小数精确表示,当且仅当它化成最简分数后,分母是 2 的幂。

最简分数分母能否精确表示
2.02/11=20
2.55/221
1.255/422
0.43757/1624
1.26/55
0.11/1010

分母里只要含有 2 以外的质因子(5、3……),二进制展开就是无限循环的,只能截断存储。这就是 0.1 + 0.2 != 0.3 的根源。

判断技巧:看小数部分的分母0.5/0.25/0.125/0.375/0.75 这一族全是 2 的幂分母,能精确;凡是 0.10.20.31.2 这种十进制里"整"的,二进制里几乎都不整。

舍入

尾数放不下时必须舍入。IEEE 754 规定四种模式:

模式规则别名
就近舍入(中间值取偶)舍到最近的可表示数;正好在两个可表示数正中间时,取尾数末位为 0(偶数)的那个默认模式
+ 舍入总取数轴上右边那个可表示数正向舍入、朝上舍入
舍入总取数轴上左边那个可表示数负向舍入、朝下舍入
0 舍入直接截断丢弃多余位,取更靠近原点的那个截断、恒舍法

就近舍入的实际操作分两种情况

  1. 不是正中间(多数情况):就是普通的"0 舍 1 入"——看被丢弃部分是大于还是小于半个末位。
  2. 正好是正中间:此时"就近"无从选择,强制让结果的最低有效位为 0。若舍入后末位是 1,则末位加 1;否则不变。

别把"取偶"当成主规则

题面写着"就近舍入(中间值取偶数)"时,那只是在报模式名。绝大多数题里被丢弃的部分并不是恰好一半,取偶规则根本不会触发,你要做的就是普通的 0 舍 1 入。

先判断"是不是正中间",再决定用哪条。反过来就会算错。

表数范围与精度:四个数别混

这四个量长得像,问法只差几个字,答案完全不同:

问的是单精度的答案怎么来的
最小规格化正数1.0×2126Emin=1e=1127=126,尾数最小是 1.0
最小正数(含非规格化)2149非规格化最小:223×2126
最大正数 / 能表示的最大正整数(2223)×2127=21282104Emax=254e=127,尾数最大是 1.111=2223
能精确表示的最大整数224有效位只有 24 位,224+1 就已经存不下了

第三行和第四行是两个完全不同的问题

  • "能表示的最大正整数"问的是范围上限——答案是 21282104,一个天文数字。
  • "能精确表示的最大整数"问的是精度上限——答案是 224,只有一千六百多万。

超过 224 之后,浮点数仍然"表示得出"更大的整数,只是表示得不精确了:224+1 会被存成 224。范围和精度是两码事,题面里"能表示"和"能精确表示"这几个字必须逐字读。

浮点数怎么比大小

移码阶码的设计就是为了这件事:

  1. 先看符号位S=0 的一定大于 S=1 的(±0 除外)。
  2. 同为正数:直接把整个 32 位当无符号整数比,大的就大——因为阶码在高位、尾数在低位,字典序正好等于数值序。
  3. 同为负数反过来——位模式作为无符号数越大,绝对值越大,值反而越小。

第 3 条是最容易翻车的。两个负浮点数,谁的阶码大谁的绝对值大,而绝对值大的那个更小。做题时先把两个数的符号和真实指数都写出来,再下结论,别凭感觉。

整数与浮点数的选型

题目给一个取值范围,问该用哪种类型——判断分两步:

  1. 范围够不够n 位补码整数的范围是 [2n1, 2n11]
  2. 精度够不够:浮点数只有 24 位(单精度)/ 53 位(双精度)有效位,超过 224 / 253 的整数就不能保证精确

优先用整型

只要范围装得下,整数一定优于浮点数:精确、且运算快。只有范围装不下时才考虑浮点,此时还要检查有效位数够不够。

例如取值范围 ±240:32 位整数装不下(上限 2311),单精度范围够但只有 24 位有效位、240 量级的整数存不准,所以必须用双精度(53 位有效位 >40)。

关于 int 与 float 相互转换时具体丢什么,见 C 语言类型转换

交互可视化

加载可视化中...
加载可视化中...

考场动作清单

拿到一道 IEEE 754 题,按这个顺序走:

  1. 展开成二进制,按 1/8/23 切开。
  2. 先看阶码:全 0 → 走非规格化公式(隐含位是 0,指数固定 126);全 1 → 是 或 NaN;否则才是规格化数。
  3. 规格化数e=E127,尾数前面补回隐含的 1。
  4. 反方向(真值 → 编码)时,尾数右边补 0 补满 23 位再拼十六进制,别少补。
  5. 看清题眼:"能表示"还是"能精确表示","最小正数"还是"最小规格化正数"。

例题

例 1(机器数 → 真值,规格化):单精度机器数 4730 0000H,求真值。

:展开 0100 0111 0011 0000 0000 0000 0000 0000

  • S=0
  • E=1000 11102=142e=142127=15
  • 尾数字段 =011 0000,补回隐含 1 得 1.0112=1.375
x=1.375×215

例 2(机器数 → 真值,非规格化):单精度机器数 8020 0000H,求真值。

:展开 1000 0000 0010 0000 0000 0000 0000 0000

  • S=1
  • E=0000 0000 全 0 非规格化数,隐含位是 0,指数固定 126
  • 尾数字段 =010 0000,即 0.012=0.25=22
x=0.25×2126=22×2126=2128

若忘了阶码全 0 这一步,会当成规格化数算出 1.01×2127——那正是准备好的干扰项。

例 3(真值 → 机器数):把 0.4375 写成单精度机器数。

0.4375=716=0.01112=1.11×22

  • S=1
  • e=2E=2+127=125=0111 11012
  • 尾数字段 =110 0000(补满 23 位)

拼起来 1 01111101 11000000000000000000000 = 1011 1110 1110 0000 0000 0000 0000 0000 = BEE0 0000H

例 4(舍入):采用就近舍入(中间值取偶),求 12.1 的单精度机器数。

12.1=1100.000110011001100110020.1 的二进制是无限循环的)

规格化:1.1000001100110011001100110011×23

  • S=0E=3+127=130=1000 00102
  • 取尾数前 23 位:1000 0011 0011 0011 0011 001

先写出截断结果:0 10000010 10000011001100110011001 = 4141 9999H

再看舍入:被丢掉的部分是 1001 1001第一位是 1 且后面还有 1,说明严格大于半个末位——不是正中间,取偶规则不触发,按 0 舍 1 入直接进位:

4141 9999H+1=4141 999AH

例 5(表数范围):单精度能表示的最大正整数是多少?最小规格化正数呢?

  • 最大:Emax=254e=127,尾数最大 1.1112=2223
(2223)×2127=21282104
  • 最小规格化正数:Emin=1e=126,尾数最小 1.0,即 1.0×2126

例 6(精确表示):1.21.252.02.5 中哪个不能被 IEEE 754 精确表示?

1.25=5/42.5=5/22.0=2/1,分母都是 2 的幂,可以精确表示。1.2=6/5,分母含质因子 5,二进制展开无限循环,不能精确表示

例 7(比大小):两个 float 变量 xy 的机器数为 CC900000HB0C00000H,求它们的大小关系。

符号阶码 Ee
x = CC900000H1(负)1001 10012=15326
y = B0C00000H1(负)0110 00012=9730

两个都是负数,符号相同。x 的绝对值约 226y 的绝对值约 230|x||y|

负数中绝对值大的更小,故 x<y且符号相同

例 8(类型选型):整型参数 αβ 的取值范围分别为 ±220±240,各该用什么类型?

  • α220<231132 位整数装得下,精确且快。
  • β240>2311,整数装不下。单精度范围虽够,但有效位只有 24 位,240 量级的整数存不准。双精度有 53 位有效位,53>40,能精确表示。

答:α 用 32 位整数,β 用双精度浮点数。

例 9(同一位模式两种读法):变量 x 的类型只可能是 intfloat,机器数为 C800 0000Hx 的值可能是多少?

:两种读法各算一遍。

  • 按 int 补码读:最高位为 1,是负数。C800 0000H=(232C800 0000H)=38000000H=939524096=7×227
  • 按 float 读S=1E=1001 00002=144e=17,尾数字段全 0,得 1.0×217=217

两个候选值里,选项中出现的是 7×227

这类题的做法是固定的:两种解释都算出来,再去选项里对。别只算一种。

常见丢分点

  1. 忘了先看阶码是不是全 0——非规格化数用错公式,指数差一。
  2. 尾数没补满 23 位就去拼十六进制。
  3. 把"能表示的最大正整数"和"能精确表示的最大整数"搞混。
  4. 舍入时不判断是否正中间,直接套"取偶"。
  5. 两个负浮点数比大小时,把绝对值大的当成更大。

考点清单

  • 单精度 1+8+23、偏置 127;双精度 1+11+52、偏置 1023
  • 规格化数:隐含前缀 1,真值 =(1)S×1.M×2E127
  • 非规格化数:阶码全 0,隐含前缀 0,指数固定 1bias=126
  • 特殊值:全 0 阶码 → ±0 / 非规格化;全 1 阶码 → ± / NaN
  • 能精确表示 最简分数的分母是 2 的幂
  • 四种舍入模式;就近舍入只有正中间时才用"取偶",否则就是 0 舍 1 入
  • 最小规格化正数 1.0×2126;最大正数 21282104;能精确表示的最大整数 224
  • 比大小:正数按位模式直接比;负数反过来,位模式大的值反而小
  • 选型先看范围、再看有效位数;范围够就用整型

教材出处

  • 袁春风《计算机组成与系统结构(第 3 版)》§3.2 浮点数的表示:IEEE 754 格式与规格化/非规格化数;§3.4 四种舍入方式与表 3.4 舍入示例(p83~84)

真题练习