“分析、概率和学习都大量使用实值对象,但相应的极限、概率量词或样本语义来自各自模型,不是实数公理的一部分。机器采用的浮点数系统也只有有限个可表示值,并在运算后舍入;它是实数计算的近似表示,不是…”
形式陈述 ​
理想化浮点系统由基数
有限的尾数和指数使可表示集合成为有限集合,而不是实数连续统。IEEE 754-2019 规定多种二进制和十进制交换格式、舍入方向、异常状态,以及加减乘除、平方根和融合乘加等操作的结果要求。标准列出的五种舍入方向是 roundTiesToEven、roundTiesToAway、roundTowardPositive、roundTowardNegative 与 roundTowardZero;默认方向是 ties-to-even。常见 binary64 具有 1 个符号位、11 个指数位和 53 位有效二进制精度;“IEEE 754”并不等同于这一种格式。
binary64 的正规有限数范围是
最小正次正规数则为
除正规数外,标准还包含正负零、次正规数、正负无穷和 NaN。渐进下溢使结果从最小正规数平滑进入次正规区,而不是直接跳到零;无穷可来自除零或某些溢出,具体溢出结果还取决于舍入方向;NaN 承载无效运算,不是实数,普通比较也不形成实数式全序。符号零比较时数值相等,却可在
异常默认可以非停机地交付结果,并置起 invalid、divisionByZero、overflow、underflow 或 inexact 状态标志;语言和运行时未必向应用暴露全部标志。quiet NaN 通常传播,signaling NaN 用于触发 invalid,但 NaN 负载如何保留不应被当作跨平台算法接口。IEEE 754 还规定 totalOrder 一类排序谓词;普通 < 与 == 并不会自动获得这套总序语义。
对受标准约束的基本运算,“正确舍入”表示先取精确数学结果,再按当前舍入方向选择规定的机器结果;它不表示任意复合表达式只发生一次舍入。融合乘加把
标准规定的是格式与运算语义,不完全决定一段源代码的每个中间值。表达式求值还可能受到语言规则、编译器重排、融合乘加、寄存器扩展精度和硬件模式影响。严谨误差分析应先声明采用的算术模型,再说明实现与模型可能不同之处。
直觉
浮点数像一把刻度会随数值大小伸缩的尺子。同一指数区间内刻度近似等距;指数增加一位后,相邻数的间距也乘以
十进制
后续运算处理的是这个机器数,而不是符号文本背后的精确有理数 0.1 并不意味着内部误差为零。
例子与边界
binary64 在 2^53 + 1 不能作为新的 binary64 整数落点;“double 能精确保存整数”必须带范围。
最小正规数以下的次正规区域使用固定间距,牺牲相对精度以保留逐渐下溢。这里常用的统一相对误差模型可能失效,却仍可给出以
NaN 的边界尤其重要:NaN == NaN 为假,普通 < 比较也不提供总序。排序、最值和几何谓词若没有先规定 NaN 策略,即使其离散算法在实数全序上正确,也没有完整的浮点输入规格。
推论与应用
浮点格式只回答“哪些值可以存、基本运算怎样返回机器结果”。局部间距、舍入误差和 unit roundoff 由舍入、机器精度与 ulp展开;多步运算的标准黑箱模型见浮点算术标准误差模型。
FFT、线性规划和方向判定等算法页面应引用共同的机器数语义,再讨论自身的误差传播或鲁棒性;把 IEEE 754 的全部特殊情形复制进每个算法页既容易不一致,也会遮住算法本身的结构。
参考资料
- IEEE Computer Society, IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2019, 2019, DOI: 10.1109/IEEESTD.2019.8766229.
- David Goldberg, “What Every Computer Scientist Should Know About Floating-Point Arithmetic,” ACM Computing Surveys 23(1), 1991, pp. 5–48, DOI: 10.1145/103162.103163.
- Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms, 2nd ed., SIAM, 2002, Ch. 2.