跳到主要内容

浮点数表示

二进制小数怎样表示?​

  • 形式: bm⋯b0.b−1⋯b−nb_m\cdots b_0.b_{-1}\cdots b_{-n};
  • 数值:

b=∑i=−nm2i×bib=\sum_{i=-n}^{m}2^i\times b_i

  • 局限: 只能精确表示 1/21/2 的幂的组合, 因此大量十进制小数无法精确表示;

IEEE 754 用哪些字段表示一个浮点数?​

  • 编码形式:

V=(−1)s×M×2EV=(-1)^s\times M\times 2^E

  • 符号位 ss: 决定正负;
  • 尾数 MM: 一个二进制小数, 决定有效数字;
  • 阶码 EE: 对尾数加权, 决定数量级;

单精度和双精度如何划分字段?​

格式总位数符号位阶码位尾数位
单精度321823
双精度6411152
  • 偏置量: 阶码有 nn 位时 Bias=2n−1−1\text{Bias}=2^{n-1}-1, 单精度为 127, 双精度为 1023;
  • 阶码字段存放的是 Bias\text{Bias} 与真实阶码之和;

阶码和尾数的取值怎样决定数值含义?​

阶码尾数含义
全 0全 0零
全 0非 0非规格化数, E=1−BiasE=1-\text{Bias}
其他任意规格化数, E=e−BiasE=e-\text{Bias}, M=1.fM=1.f
全 1全 0无穷大
全 1非 0NaN
  • 规格化数: 尾数隐含前导 1, 即 1.xxx1.xxx 形式;
  • 非规格化数: 尾数不带隐含的 1, 用于从最小规格化数平滑过渡到 0;

非负浮点数的取值边界是多少?​

类型值单精度双精度
零000.00.00.00.0
最小非规格化数2−23×2−1262^{-23}\times2^{-126}1.4×10−451.4\times10^{-45}4.9×10−3244.9\times10^{-324}
最大非规格化数(1−ϵ)×2−126(1-\epsilon)\times2^{-126}1.2×10−381.2\times10^{-38}2.2×10−3082.2\times10^{-308}
最小规格化数1×2−1261\times2^{-126}1.2×10−381.2\times10^{-38}2.2×10−3082.2\times10^{-308}
最大规格化数(2−ϵ)×2127(2-\epsilon)\times2^{127}3.4×10383.4\times10^{38}1.8×103081.8\times10^{308}
无穷大∞\infty——

十进制浮点数怎样转成 IEEE 754 单精度?​

  1. 把十进制数转成二进制小数;
  2. 规格化为 1.xxx×2n1.xxx\times2^n 的形式;
  3. 取小数部分左对齐并补 0, 得到 23 位尾数;
  4. 阶码 nn 加上偏置量 127, 写成 8 位二进制;
  5. 加上符号位;
例: 176.0625 的单精度表示
1) 转二进制: 176.0625 = 10110000.0001
2) 规格化: 1.01100000001 × 2^7
3) 尾数: 01100000001000000000000
4) 阶码: 7 + 127 = 134 = 10000110
5) 符号位: 0
结果: 0 10000110 01100000001000000000000

浮点数怎样舍入?​

  • 前提: 尾数位有限, 多数实数无法精确表示;
  • 目标: 在可表示的数里找最接近的一个;
  • 结果: 误差无法消除, 只能控制量级;
  • 后果: 舍入使浮点运算不再满足结合律, 改变运算顺序会改变结果;

为什么浮点运算不精确?​

  • 机制: 每次运算的结果都要舍入到可表示值;

x⊙y=Round(x⊙y)x\odot y=\text{Round}(x\odot y)

  • 解释: 运算结果是精确结果的舍入值, 误差会随运算次数累积;