Knuth‘s TwoSum Algorithm 原理详解
1. Knuth 的算法
1.1. 算法代码
function [x, y] = TwoSum(a, b)x = fl(a + b) # a+b 的浮点近似值z = fl(x - a) # 中间计算值y = fl((a - fl(x - z)) + (b - z)) # 修正项
1.2. 核心目标
将任意浮点数对 (a, b)
转换为 (x, y)
,满足:
x = fl(a + b):
x
是a+b
的标准浮点计算结果(含舍入误差)x + y = a + b:数学上的精确相等(实数算术中的精确值)
这里的 =
表示数学上的精确相等,不是浮点近似。即 x + y
在实数域严格等于 a + b
。
2. 算法原理(基于 IEEE 754 标准)
2.1. 关键前提条件
浮点运算模式:四舍五入到最近(Round to Nearest)
无溢出:结果在浮点表示范围内
IEEE 754 特性:减法在指数相近时无舍入误差(Sterbenz 引理)
2.2. 步骤分解与数学证明
设浮点运算的舍入误差为符号表示:
,其中
(机器精度)
(双精度)
步骤 1: 计算 
其中 是加法的舍入误差。
步骤 2: 计算 
代入 :
步骤 3: 计算 
子步骤 3.1: 计算
代入 和
:
子步骤 3.2: 计算
子步骤 3.3: 计算
子步骤 3.4: 求和并舍入
3. 最终结果验证
但根据 Sterbenz 引理:
当 和
符号相反时,
很小
浮点减法 无舍入误差(
)
进而 (因为
无误差)
因此:
4. 为什么
能精确计算?
微小量特性:
的量级
的量级极小
无二次舍入:
IEEE 754 保证:当
时,亚正规数可精确表示
远小于最小正规数(
),但大于最小亚正规数(
)
因此
可被浮点数精确表示(无舍入误差)
5.示例演示(双精度)
令 ,
直接计算:
TwoSum 步骤:
验证:
6. 关键点总结
特性 | 说明 |
---|---|
等号 = 含义 | 数学精确相等(非浮点近似) |
误差补偿 | |
适用条件 | IEEE 754 双精度 + 四舍五入模式 + 无溢出 |
精度保证 | 利用亚正规数表示微小量 |
应用场景 | 高精度求和算法的基础(如 Kahan 求和、补偿求和) |
该算法通过巧妙的误差分离,在浮点数系统中实现了数学精确性,是数值计算中处理精度的基石技术。