精简版 · 小杯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]
偏置值 bias27−1=127210−1=1023
有效位数24 位(含隐含 1)53 位(含隐含 1)

规格化数 ​

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

真值=(−1)S×1.M×2E−bias

阶码范围 1≤E≤254(单精度),即真实指数 −126≤e≤127。

特殊值与非规格化数 ​

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

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

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

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

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

为什么阶码用移码 ​

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

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

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

方向一:机器数 → 真值 ​

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

方向二:真值 → 机器数 ​

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

常用二进制小数速查

0.5=2−1=0.12,0.25=0.012,0.125=0.0012,0.0625=0.00012。

0.375=0.25+0.125=0.0112,0.4375=0.25+0.125+0.0625=0.01112,0.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.1、0.2、0.3、1.2 这种十进制里"整"的,二进制里几乎都不整。

舍入 ​

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

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

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

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

别把"取偶"当成主规则

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

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

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

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

问的是单精度的答案怎么来的
最小规格化正数1.0×2−126Emin=1,e=1−127=−126,尾数最小是 1.0
最小正数(含非规格化)2−149非规格化最小:2−23×2−126
最大正数 / 能表示的最大正整数(2−2−23)×2127=2128−2104Emax=254,e=127,尾数最大是 1.11…1=2−2−23
能精确表示的最大整数224有效位只有 24 位,224+1 就已经存不下了

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

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

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

浮点数怎么比大小 ​

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

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

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

整数与浮点数的选型 ​

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

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

优先用整型

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

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

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

交互可视化 ​

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

考场动作清单 ​

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

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

例题 ​

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

解:展开 0100 0111 0011 0000 0000 0000 0000 0000

  • S=0
  • E=1000 11102=142,e=142−127=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=2−2
x=−0.25×2−126=−2−2×2−126=−2−128

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

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

解:0.4375=716=0.01112=1.11×2−2

  • S=1
  • e=−2,E=−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.0001100110011001100…2(0.1 的二进制是无限循环的)

规格化:1.1000001100110011001100110011…×23

  • S=0,E=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=254⇒e=127,尾数最大 1.11…12=2−2−23
(2−2−23)×2127=2128−2104
  • 最小规格化正数:Emin=1⇒e=−126,尾数最小 1.0,即 1.0×2−126

例 6(精确表示):1.2、1.25、2.0、2.5 中哪个不能被 IEEE 754 精确表示?

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

例 7(比大小):两个 float 变量 x、y 的机器数为 CC900000H 和 B0C00000H,求它们的大小关系。

解:

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

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

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

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

解:

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

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

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

解:两种读法各算一遍。

  • 按 int 补码读:最高位为 1,是负数。C800 0000H=−(232−C800 0000H)=−38000000H=−939524096=−7×227
  • 按 float 读:S=1,E=1001 00002=144,e=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×2E−127
  • 非规格化数:阶码全 0,隐含前缀 0,指数固定 1−bias=−126
  • 特殊值:全 0 阶码 → ±0 / 非规格化;全 1 阶码 → ±∞ / NaN
  • 能精确表示 ⇔ 最简分数的分母是 2 的幂
  • 四种舍入模式;就近舍入只有正中间时才用"取偶",否则就是 0 舍 1 入
  • 最小规格化正数 1.0×2−126;最大正数 2128−2104;能精确表示的最大整数 224
  • 比大小:正数按位模式直接比;负数反过来,位模式大的值反而小
  • 选型先看范围、再看有效位数;范围够就用整型

教材出处 ​

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

真题练习 ​