机器数与 IEEE-754:浮点数是怎么存进 32 位的
机器数与 IEEE-754
核心结论
能在二进制下被完美表示(没有无限循环小数位)的数,称为机器数。IEEE-754 用「符号位 + 偏移指数 + 尾数」三段把浮点数塞进固定位宽:单精度 32 位(bias 127)、双精度 64 位(bias 1023)。理解机器数的价值在于:计算机里所有小数运算的误差、溢出、比较失败,都源于这个表示法本身的离散性。
一、机器数
一个十进制数转成机器能识别的二进制数时,若能被完美表示为二进制而不存在无限不循环小数位,这个数就是机器数。
把尾数的小数点放在第一位与第二位之间、并保证首位非 0,这个处理叫规范化(normalized)。
二、IEEE-754 的三种形式
IEEE 754 规定了四种表示方式:单精度(32 位)、双精度(64 位)、延伸单精度(43 位以上,很少用)、延伸双精度(79 位以上,通常 80 位实现)。本项目用到前两种:
| 符号位 s | 指数位 e′ | 尾数 m | 偏移量 bias | |
|---|---|---|---|---|
| 单精度 SP | 1 位 | 8 位 | 23 位 | 127 |
| 双精度 DP | 1 位 | 11 位 | 52 位 | 1023 |
- 符号位:0 正 1 负;
- 偏移指数 e′:以 2 为底的指数加上 bias 后的无符号数;
- 尾数 m:规范化后小数点右侧的位(整数部分的 1 被隐式省略,即「隐藏位」)。
三、十进制 → 机器数(小数值)
以 20.5 为例:
- 转二进制:
- 规范化: → 尾数
01001,未偏移指数 e = 4 - 加偏移:
- 尾数补足 23 位:
0100 1000 0000 0000 000 - 组装(正数 s = 0):
0 10000011 01001000000000000000000 = 0x41A40000四、十进制 → 机器数(大数)
对 这类数,直接展开不现实,用「数量级估算」:
- 符号为负 → s = 1;
- 取绝对值,把 换成二进制量级:因 ,故 ;
- → ;
- 于是 ,;
- 把 转二进制得 24 位,按舍入规则截到 23 位;
1 11001010 01010000100010000100010 = 0xE5284422估算次方数时的反直觉之处:次方数估得越"精确"反而误差越大,先取整到几十次方即可。
五、机器数 → 十进制
例:SP 机器数 0xD1500000
0xD1500000 = 1101 0001 0101 0000 … 0000
s = 1
e' = 2^7 + 2^5 + 2^1 = 162 → e = e' - 127 = 35
m = 1.1010 0000 …(含隐藏位)
value = (-1)^s × 1.625 × 2^35 = -1.625 × 2^35 ≈ -5.583 × 10^10通用公式:
六、特殊值与数值范围
当 全 0 或全 1 时,编码用于表示特殊值:±0、±∞、NaN(以及非规格化数)。因此正常数的指数范围是 (SP)/ (DP)。
| 最大机器数值 | 最小机器数值 | |
|---|---|---|
| 单精度 | ||
| 双精度 |
- 溢出(Overflow):绝对值 > 最大值(如单精度 );
- 下溢(Underflow):绝对值 < 最小值(如单精度 )。
七、上一位 / 下一位与机器精度
相邻两个机器数之间的距离由尾数最低位()与指数共同决定:
对 20.5(e = 4):
下一位 = 20.5 + 2^4 × 2^-23 = 20.5000019073486328125
上一位 = 20.5 - 2^4 × 2^-23 = 20.4999980926513671875机器精度 定义为该精度下「1 与下一个机器数之间的距离」:
一般规律: = 2 的「尾数最后一位所代表的二进制位数」次方。
八、误差与舍入
任何落在「本位数 ± 半个间隔」之间的实数,都会被估计为最近的机器数(四舍六入五成双的邻域思想)。由此产生:
例:20.4999991 与 20.5 的真误差 0.0000009,真实相对误差 ≈ 0.00000439%。
舍入规则:把小数位限制在尾数位内,对紧接着的那一位(MSB)判定 ——
- MSB 为 0:剩余全部舍去(截断);
- MSB 为 1:尾数末位加一。
例: → s = 0、、尾数取 0010 1100 1100 1100 110,其后为 01,MSB = 0 → 直接舍去。
九、工程含义
- 浮点数不满足结合律:,累加大量小数时要用 Kahan 求和或高精度中间量;
- 不要用
==比较浮点,用 容差; - 0.1 + 0.2 ≠ 0.3 的根因就在这里:0.1 在二进制下是无限循环小数,存进机器数时已被舍入;
- 相对误差随数值量级变化,而绝对误差随指数增长 —— 大数运算更容易丢失低位有效信息。
来源
- 知识源:计算机组成原理(源笔记摘要) —— 本页所有例子(20.5、-4.966×10²²、0xD1500000、20.4999991)均出自该目录笔记
- 原文:计算机组成原理(README)
- 相关:计算与仿真(误差来源、霍纳法则、泰勒展开)
- 在线转换器:https://www.h-schmidt.net/FloatConverter/IEEE754.html
