Skip to content

浮点数系统与 IEEE 754

Floating-point system · IEEE 754

以有限尾数和指数表示机器数,并说明 IEEE 754 的特殊值、格式与运算语义。

形式陈述

理想化浮点系统由基数 β2、精度 p 和指数范围 emineemax 决定。一个非零正规数写成

x=(1)s(d0.d1dp1)ββe,d00,0di<β.

有限的尾数和指数使可表示集合成为有限集合,而不是实数连续统。IEEE 754-2019 规定多种二进制和十进制交换格式、舍入方向、异常标志,以及加减乘除、平方根等基本运算的结果要求。常见 binary64 具有 1 个符号位、11 个指数位和 53 位有效二进制精度;“IEEE 754”并不等同于这一种格式。

除正规数外,标准还包含正负零、次正规数、正负无穷和 NaN。次正规数在最小正规指数附近逐渐放弃有效位,使下溢不是从最小正规数直接跳到零;无穷可表示某些溢出或除零结果;NaN 承载无效运算,不是实数,普通比较也不形成实数式全序。符号零数值相等,却可在 1/(+0)1/(0) 等运算中保留方向信息。

标准规定的是格式与运算语义,不完全决定一段源代码的每个中间值。表达式求值还可能受到语言规则、编译器重排、融合乘加、寄存器扩展精度和硬件模式影响。严谨误差分析应先声明采用的算术模型,再说明实现与模型可能不同之处。

直觉

浮点数像一把刻度会随数值大小伸缩的尺子。同一指数区间内刻度近似等距;指数增加一位后,相邻数的间距也乘以 β。因此机器数在零附近密、在大数附近疏,不能把它想成实轴上固定小数位数的均匀网格。

十进制 0.1 在二进制中循环展开,和 1/3 不能有限十进制表示是同一现象。程序读入 0.1 时通常先选择最邻近的 binary64 数;后续运算处理的是这个机器数,而不是符号文本背后的精确有理数 1/10

例子与边界

binary64 在 1 附近的下一个可表示数是 1+252,而在 253 附近相邻间距已经是 2。所以所有绝对值不超过 253 的整数都能精确表示,但 2^53 + 1 不能作为新的 binary64 整数落点;“double 能精确保存整数”必须带范围。

最小正规数以下的次正规区域使用固定间距,牺牲相对精度以保留逐渐下溢。这里常用的相对误差模型可能失效,却仍可给出绝对误差界。若硬件启用 flush-to-zero,实际行为又会偏离渐进下溢假设。

NaN 的边界尤其重要:NaN == NaN 为假,普通 < 比较也不提供总序。排序、最值和几何谓词若没有先规定 NaN 策略,即使其离散算法在实数全序上正确,也没有完整的浮点输入规格。

推论与应用

浮点格式只回答“哪些值可以存、基本运算怎样返回机器结果”。局部间距、舍入误差和 unit roundoff 由舍入、机器精度与 ulp展开;多步运算的标准黑箱模型见浮点算术标准误差模型

FFT、线性规划和方向判定等算法页面应引用共同的机器数语义,再讨论自身的误差传播或鲁棒性;把 IEEE 754 的全部特殊情形复制进每个算法页既容易不一致,也会遮住算法本身的结构。

参考资料
  • IEEE, IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2019.
  • David Goldberg, “What Every Computer Scientist Should Know About Floating-Point Arithmetic,” ACM Computing Surveys 23(1), 1991.
  • Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms, 2nd ed., SIAM, 2002, Ch. 2.