1.1.4 浮点数表示
本节导学:浮点数把“小数点位置”变成可编码的信息
定点数的小数点位置固定,适合表示金额、计数器、地址偏移这类范围相对可控的数据。但科学计算、工程仿真、图形处理里经常同时出现极大的数和极小的数。若仍用定点数,要么范围不够,要么为了范围牺牲大量精度。
浮点数的思路是把一个数拆成两部分:
它不是“更精确的定点数”,而是在有限位宽下重新分配能力:阶码负责范围,尾数负责精度。软考最喜欢用这一句话做概念判断。
1. 从定点到浮点:技术为什么要迭代
| 表示方式 | 思想 | 优点 | 缺陷 | 适用场景 |
|---|---|---|---|---|
| 定点整数 | 小数点固定在最右侧 | 运算简单、精确、硬件实现直接 | 不能表示小数;范围由位数直接限制 | 计数、地址、整数运算 |
| 定点小数 | 小数点固定在符号位后 | 适合表示绝对值小于 1 的小数 | 很难同时表示极大值和极小值 | 固定比例的小数运算 |
| 浮点数 | 小数点位置由阶码控制 | 表示范围大,能覆盖不同数量级 | 只能近似表示多数实数;运算要对阶、舍入、规格化 | 科学计算、图形、机器学习、工程数据 |
所以浮点数不是“淘汰定点数”,而是补上定点数在大范围实数表达上的短板。代价也很明确:浮点数更复杂,并且会带来舍入误差。
2. 浮点数的字段结构
通用教材里的浮点格式可以抽象成:
课程里强调:二进制浮点数的基数
图里上半部分是原理表达:
不同教材、不同题目对字段拆分可能不同。软考范围题的原则是“题干怎么给字段,就按题干字段算”,不要强行套 IEEE 754。
3. 阶码决定范围,尾数决定精度
阶码控制小数点能移动多远,因此决定数量级;尾数控制能保留多少有效位,因此决定精细程度。
| 问题 | 主要由谁决定 | 直观解释 | 软考关键词 |
|---|---|---|---|
| 能表示多大、多小 | 阶码位数 | 指数能把小数点推多远 | 表示范围、上溢、下溢 |
| 能表示多精细 | 尾数位数 | 有效数字能保留多少位 | 精度、有效位、舍入误差 |
| 正负号 | 数符 | 整个浮点数的正负 | 数符、符号位 |
| 指数正负 | 阶符或移码 | 小数点向左还是向右移动 | 阶符、阶码、偏置 |
如果选择题问“浮点数可表示范围主要取决于什么”,优先找阶码;问“有效精度主要取决于什么”,优先找尾数。
4. 为什么阶码常用移码,尾数常用补码
阶码的主要任务是表示指数大小,并且经常需要比较两个浮点数的阶码,以便进行对阶。移码把负指数、零指数、正指数映射到一个更适合按无符号数比较的序列中,所以常用于阶码。
尾数要参与加减运算。补码的优势是能把加法和减法统一到加法器上,因此传统教材常说尾数常用补码表示。到了 IEEE 754,尾数部分又采用了更规范化的符号、指数、尾数字段设计,其中指数使用偏置思想,尾数保存规格化有效数字。
| 字段 | 常见表示 | 为什么这样设计 | 替代或规范化的原因 |
|---|---|---|---|
| 阶码 | 移码/偏置码 | 便于比较指数大小 | 统一格式后,硬件和软件都能按标准解释 |
| 尾数 | 补码或原码思想下的有效数 | 尾数需要参与运算或表示有效数字 | IEEE 754 统一了符号、指数、尾数的解释方式 |
| 基数 | 通常固定为 2 | 不必浪费字段保存 | 固定基数让硬件实现更简单 |
这也是技术迭代的典型模式:早期教材抽象便于理解原理,工程标准则更强调跨平台一致性、异常值处理、舍入规则和硬件实现。
5. 对阶:小阶向大阶看齐
两个浮点数相加时,不能直接把尾数相加,因为它们可能处在不同数量级上。
十进制例子:
第二个数的阶码小,需要向第一个数的阶码 3 看齐:
于是:
二进制里也是同样原则:把小阶码调大,同时尾数右移来保持真值不变。有符号尾数右移时要用算术右移,也就是高位补符号位,避免正负号被破坏。
6. 浮点加减的完整流程
“对阶”解决能不能加,“规格化”解决表示是否规范,“舍入”解决位数不够,“溢出检查”解决结果是否还在可表示范围内。
7. 规格化:让同一个数只有一种主要写法
同一个十进制数可以写成多种科学计数法形式:
如果机器允许任意形式,比较和后续运算都会变复杂。规格化就是约定尾数必须落在某个范围内,使有效位尽量靠前。
二进制教材里常见约定是尾数绝对值落在某个固定区间,例如
规格化的好处是提高尾数字段利用率,减少同值多码;代价是每次运算后可能需要额外调整。
8. IEEE 754:从“会表示”走向“大家都按同一套规则表示”
软设通常不深挖 IEEE 754 的每个特殊值,但要知道它解决了什么问题。没有统一标准时,不同机器可能用不同浮点格式,同一个二进制串在不同平台上解释不同,运算结果也难以保证一致。
| 层面 | 自定义浮点格式 | IEEE 754 标准化格式 |
|---|---|---|
| 可移植性 | 不同机器格式可能不同 | 跨平台解释一致 |
| 指数 | 可能用阶符+阶码,也可能用移码 | 使用偏置指数思想 |
| 尾数 | 教材题常按补码/原码讨论 | 规格化有效数字,配合隐藏位等设计 |
| 异常值 | 处理方式不统一 | 规定无穷大、NaN、非规格化数等 |
| 代价 | 简单题易算 | 标准细节更多,硬件实现更复杂 |
单精度 IEEE 754 的字段常被概念性提到:
考试如果没有明确说 IEEE 754,就按题干自定义字段来算;如果明确说 IEEE 754,再考虑偏置指数等标准规则。
9. 范围题的解题框架
遇到“某浮点格式有若干位阶码、若干位尾数,求最大值/最小值/范围”时,不要直接套背诵答案,按下面拆:
- 找阶码字段:判断阶码用移码、补码,还是单独阶符加阶码值。
- 求阶码可表示的最大指数和最小指数。
- 找尾数字段:判断尾数是定点小数、补码小数,还是题干另有规定。
- 求尾数绝对值能取到的最大有效值。
- 组合成
。 - 判断是否要求规格化、是否包含 0、是否问正数范围还是全体范围。
软考陷阱通常在第 1 步和第 3 步:把阶码码制看错,或者把尾数小数当成整数。
🧪 例题(按难度)
简单(3题)
例题1(概念题:范围/精度)
中级(3题)
例题2(对阶规则)
困难(1题)
例题3(范围题:按题干位段推范围)
设 16 位浮点数格式为:阶符 1 位、阶码 6 位、数符 1 位、尾数 8 位。
- 阶码(指数部分)用 移码 表示(此处按题干:指数总位数=阶符+阶码=7 位)
- 尾数(纯小数)用 补码 表示(数符+尾数=9 位定点小数)
问:该浮点数可表示的数值范围(近似写法)最合理的是:
📚 本课小结
- 浮点数:
- 阶码位数决定范围;尾数位数决定精度
- 加减流程:对阶(小数向大数看齐)→ 尾数运算 → 规格化