当前位置: 首页 > news >正文

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),满足:

  1. x = fl(a + b)x 是 a+b 的标准浮点计算结果(含舍入误差)

  2. x + y = a + b:数学上的精确相等(实数算术中的精确值)

这里的 = 表示数学上的精确相等,不是浮点近似。即 x + y 在实数域严格等于 a + b

 

2. 算法原理(基于 IEEE 754 标准)

2.1. 关键前提条件
  1. 浮点运算模式:四舍五入到最近(Round to Nearest)

  2. 无溢出:结果在浮点表示范围内

  3. IEEE 754 特性:减法在指数相近时无舍入误差(Sterbenz 引理)

 

2.2. 步骤分解与数学证明

设浮点运算的舍入误差为符号表示:

         \text{fl}(x) = x(1 + \delta),其中 |\delta| \leq \epsilon(机器精度)

        \epsilon = 2^{-53}(双精度)

步骤 1: 计算 x = \text{fl}(a + b)

        x = (a + b) + e_1, \quad |e_1| \leq \epsilon |a + b|

    其中 e_1​ 是加法的舍入误差。

步骤 2: 计算 z = \text{fl}(x - a)

        z = (x - a) + e_2, \quad |e_2| \leq \epsilon |x - a|

代入 x

        z = \not{a} + b + e_1 - \not{a} + e_2 = b + e_1 + e_2

步骤 3: 计算 y = \text{fl}((a - \text{fl}(x - z)) + (b - z))

子步骤 3.1: 计算 \text{fl}(x - z)

        \text{fl}(x - z) = (x - z) + e_3, \quad |e_3| \leq \epsilon |x - z|

代入 x 和 z

        x - z = (a + b + e_1) - (b + e_1 + e_2) = a - e_2    

        \text{fl}(x-z)=(a-e_2)+e_3 

子步骤 3.2: 计算 a - \text{fl}(x - z)

        a - \text{fl}(x - z) = a - [(a - e_2) + e_3] = e_2 - e_3

子步骤 3.3: 计算 b - z

        b - z = b - (b + e_1 + e_2) = -e_1 - e_2

子步骤 3.4: 求和并舍入

        y = \text{fl}(\underbrace{(e_2 - e_3)}_{\text{small}} + \underbrace{(-e_1 - e_2)}_{\text{small}})   

        y=\text{fl}(-e_1-e_3)=-e_1-e_3 \quad (\text{error-round-off-free})

 

3. 最终结果验证

        x + y = (a + b + e_1) + (-e_1 - e_3) = a + b - e_3

但根据 Sterbenz 引理

        当 a 和 b 符号相反时,|x - a| 很小

        浮点减法 x - a 无舍入误差e_2 = 0

        进而 e_3 = 0(因为 \text{fl}(x - z) 无误差)

因此:

         \boxed{x + y = a + b}

 

4. 为什么 y 能精确计算?

  1. 微小量特性

    • e_1, e_2, e_3​ 的量级 \leq \epsilon \cdot \max(|a|, |b|)

    • y = -e_1 - e_3​ 的量级极小

  2. 无二次舍入

    • IEEE 754 保证:当 |\text{result}| \leq 2^{-1022} 时,亚正规数可精确表示

    • |y| 远小于最小正规数(\sim 10^{-308}),但大于最小亚正规数(\sim 10^{-324}

    • 因此 y 可被浮点数精确表示(无舍入误差)

 

5.示例演示(双精度)

  令 a = 1.0b = 2^{-53} \approx 1.11 \times 10^{-16}

  1. 直接计算

    \text{fl}(a + b) = 1.0 \quad (\text{round-off-error} = 2^{-53})
  2. TwoSum 步骤

    • x = \text{fl}(1.0 + 2^{-53}) = 1.0

    • z = \text{fl}(1.0 - 1.0) = 0.0

    • \text{fl}(x - z) = \text{fl}(1.0 - 0.0) = 1.0

    • y = \text{fl}((1.0 - 1.0) + (2^{-53} - 0.0)) = 2^{-53}

  3. 验证

    x + y = 1.0 + 2^{-53} = a + b \quad (\text{faithful-equal})

 

6. 关键点总结

特性说明
等号 = 含义数学精确相等(非浮点近似)
误差补偿y 捕获了 \text{fl}(a+b) 的舍入误差
适用条件IEEE 754 双精度 + 四舍五入模式 + 无溢出
精度保证利用亚正规数表示微小量
应用场景高精度求和算法的基础(如 Kahan 求和、补偿求和)

        该算法通过巧妙的误差分离,在浮点数系统中实现了数学精确性,是数值计算中处理精度的基石技术。

http://www.xdnf.cn/news/1277659.html

相关文章:

  • JS实现数组扁平化
  • 【C#补全计划】万类之父中的方法
  • Linux环境下实现简单TCP通信(c)
  • 《算法导论》第 16 章 - 贪心算法
  • [激光原理与应用-221]:设计 - 皮秒紫外激光器 - 常见技术难题、原因与解决方案
  • 博览会(树形DP)
  • 性能解析案例
  • Speaking T2 - Dining Hall to CloseDuring Spring Break
  • 论文复现与分析内容关于一种实用的车对车(V2V)可见光通信(VLC)传播模型
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DNS欺骗、DHCP饿死)
  • Doubletrouble靶机练习
  • Leaflet地图高亮与编辑功能实现
  • Jmeter性能测试之检测服务器CPU/Memory/磁盘IO/网络IO
  • 深度学习-卷积神经网络-AlexNet
  • 【走进Docker的世界】Docker环境搭建
  • 震动马达实现库函数版(STC8)
  • 机器学习——多元线性回归
  • C++移动语义、完美转发及编译器优化零拷贝
  • [创业之路-541]:经营分析会 - 企业的经营分析会,研发负责人负责提供哪些信息?
  • 【RocketMQ 生产者和消费者】- ConsumeMessageOrderlyService 顺序消费消息
  • 不同于传统的简并模分离圆极化天线,基于耦合谐振器的圆极化天线的原理是什么?
  • 如何通过API接口实现批量获取淘宝商品数据?(官方与非官方渠道分享)
  • 代码随想录算法训练营第六十天|图论part10
  • Java 基础编程案例:从输入交互到逻辑处理
  • ATF(TF-A)安全通告 TFV-12(CVE-2024-5660)
  • JDBC的连接过程(超详细)
  • 机器学习——标准化、归一化
  • 从零开始理解百度语音识别API的Python实现
  • nginx 反向代理传递原始域名
  • 前端开发中的常见问题与实战解决方案​