当前位置: 首页 > 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.dtcms.com/a/324972.html

相关文章:

  • MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查
  • 【东枫科技】FR3 可扩展测试平台,适用于 6G 研究与卫星通信,高达 1.6 GHz 的带宽
  • 【自动化运维神器Ansible】playbook案例解析:Tags组件实现任务选择性执行
  • 【01】华勤技术股份有限公司——华勤C++笔试,题目记录及解析
  • Java基础-使用反射做一个简易框架
  • Python 实例属性和类属性
  • 【PyTorch】单目标检测项目
  • vulnhub-Drippingblues靶机
  • Typora结合PicGo + 使用Gitee搭建个人免费图床
  • 计算机网络---IP(互联网协议)
  • 2025年6月电子学会全国青少年软件编程等级考试(Python六级)真题及答案
  • 二叉树进阶 之 【二叉搜索树的简介与模拟实现的前提准备】
  • 【杂谈】-智能代理+可观察性:构建下一代复杂系统监控体系
  • UE5多人MOBA+GAS 41、制作一个飞弹,添加准心索敌
  • JS实现数组扁平化
  • 计算二分类误差时的常见错误及解决方案
  • ubuntu22.04+samba
  • VMware 使用 Ubuntu 一段时间后逐渐卡顿、甚至卡死的问题
  • sqli-labs-master/Less-51~Less-61
  • 解读 GPT-5:从“博士级 AI 专家”能力到 OpenAI API Key 获取与实践(提示工程→性能调优全流程)
  • MySQL自增ID与UUID的区别及其在索引分裂中的表现与优化
  • W3D引擎游戏开发----从入门到精通【23】
  • 2013年考研数学(二)真题
  • A#语言详解
  • 相比于传统的全波分析,特征模分析具有哪些优点
  • vue如何监听localstorage
  • 博览会(树形DP)
  • 机器学习——标准化、归一化
  • Spring Boot 事务详解:原理与实操指南
  • AQS(AbstractQueuedSynchronizer)底层源码实现与设计思想