浮点数表示
二进制小数怎样表示?
- 形式: ;
- 数值:
- 局限: 只能精确表示 的幂的组合, 因此大量十进制小数无法精确表示;
IEEE 754 用哪些字段表示一个浮点数?
- 编码形式:
- 符号位 : 决定正负;
- 尾数 : 一个二进制小数, 决定有效数字;
- 阶码 : 对尾数加权, 决定数量级;
单精度和双精度如何划分字段?
| 格式 | 总位数 | 符号位 | 阶码位 | 尾数位 |
|---|---|---|---|---|
| 单精度 | 32 | 1 | 8 | 23 |
| 双精度 | 64 | 1 | 11 | 52 |
- 偏置量: 阶码有 位时 , 单精度为 127, 双精度为 1023;
- 阶码字段存放的是 与真实阶码之和;
阶码和尾数的取值怎样决定数值含义?
| 阶码 | 尾数 | 含义 |
|---|---|---|
| 全 0 | 全 0 | 零 |
| 全 0 | 非 0 | 非规格化数, |
| 其他 | 任意 | 规格化数, , |
| 全 1 | 全 0 | 无穷大 |
| 全 1 | 非 0 | NaN |
- 规格化数: 尾数隐含前导 1, 即 形式;
- 非规格化数: 尾数不带隐含的 1, 用于从最小规格化数平滑过渡到 0;
非负浮点数的取值边界是多少?
| 类型 | 值 | 单精度 | 双精度 |
|---|---|---|---|
| 零 | |||
| 最小非规格化数 | |||
| 最大非规格化数 | |||
| 最小规格化数 | |||
| 最大规格化数 | |||
| 无穷大 | — | — |
十进制浮点数怎样转成 IEEE 754 单精度?
- 把十进制数转成二进制小数;
- 规格化为 的形式;
- 取小数部分左对齐并补 0, 得到 23 位尾数;
- 阶码 加上偏置量 127, 写成 8 位二进制;
- 加上符号位;
例: 176.0625 的单精度表示
1) 转二进制: 176.0625 = 10110000.0001
2) 规格化: 1.01100000001 × 2^7
3) 尾数: 01100000001000000000000
4) 阶码: 7 + 127 = 134 = 10000110
5) 符号位: 0
结果: 0 10000110 01100000001000000000000
浮点数怎样舍入?
- 前提: 尾数位有限, 多数实数无法精确表示;
- 目标: 在可表示的数里找最接近的一个;
- 结果: 误差无法消除, 只能控制量级;
- 后果: 舍入使浮点运算不再满足结合律, 改变运算顺序会改变结果;
为什么浮点运算不精确?
- 机制: 每次运算的结果都要舍入到可表示值;
- 解释: 运算结果是精确结果的舍入值, 误差会随运算次数累积;