原文:http://www.myexception.cn/other/969340.html

Kahan求和公式原理:

首先,这个算法就是用来求和的,求a1+a2+a3+...为什么不直接相加呢,而要用Kahan求和公式呢,这个算法的用武之地在哪呢,一一道来

kahan求和算法能避免大数吃小数的情况。

大数吃小数是什么意思呢?举个例子,我们用两个float相加,float是32位,它的精度是小数点后6-7位

(详见http://blog.csdn.net/zhangpinghao/article/details/8138732),设有a=123456;b=2.189;a+b应该是123458.189但是由于float的精度只有小数点后6-7位,所以必然得不到123458.189,后面的89可能会截掉,8不一定,9是必然会截掉的。好的,才做一个加法就产生至少了0.009的误差,做1000个这样的加法,误差就是9了,这显然不是我们想要的。

kahan求和算法可以避免这种情况,它有一个数用来记住那个被截断的小数,同样做下面的计算,设有a=123456;b=2.189;计算a+b。kahan求和算法是这样做的:sum=a+b(不准确); temp= (a+b)-a-b;temp等于多少呢,初看这不就是0吗?不是的,计算机此时算的可不是0,而是等于-0.009,就是被截断的那个小数。通过一个临时变量我们就记住了这个误差,当计算下一个加法的时候,可以把这个误差补上,并且更新误差到sum。

其实也可以这样理解,sum不是由于数太大,占用了小数的精度吗,而这个小数在当前一步看似是可以忽略的,但是由于,迭代的次数旁道,小数会累积成大误差,那么我们另外用的float专门记住这个误差小数不就得了吗。

维基百科写的更详细一点http://en.wikipedia.org/wiki/Kahan_summation_algorithm

function KahanSum(input)var sum = 0.0var c = 0.0          //A running compensation for lost low-order bits.for i = 1 to input.length doy = input[i] - c    //So far, so good: c is zero.t = sum + y         //Alas, sum is big, y small, so low-order digits of y are lost.c = (t - sum) - y   //(t - sum) recovers the high-order part of y; subtracting y recovers -(low part of y)sum = t             //Algebraically, c should always be zero. Beware eagerly optimising compilers!//Next time around, the lost low part will be added to y in a fresh attempt.return sum

Kahan summation相关推荐

  1. Kahan's Summation Formula原理—它是如何处理大数吃小数的

    Kahan's Summation Formula原理-它是如何避免大数吃小数的 Kahan求和公式原理: 首先,这个算法就是用来求和的,求a1+a2+a3+...为什么不直接相加呢,而要用Kahan ...

  2. 计算机浮点数运算误差与解决误差的算法

    1.  浮点数IEEE 754表示方法 要搞清楚float累加为什么会产生误差,必须先大致理解float在机器里怎么存储的,这里只介绍一下组成 由上图可知(摘在[2]), 浮点数由: 符号位 + 指数 ...

  3. delphi 中的浮点数 (转载)

    原文地址 Floating point numbers - Sand or dirt Floating point numbers are like piles of sand; every time ...

  4. 浮点数美丽的表象(为什么要慎用浮点数)

    现在假设你负责一个广告公司的结算系统,你需要统计下月度点击收入,生成一个月度报告.假设有2000w个点击,每个点击平均1元,我们用小学数学计算就知道总收入是2000w.但是我们用计算机累加就会出问题了 ...

  5. 【练拳不练功,到老一场空】深入浅出计算机组成原理

    深入浅出计算机组成原理 文章目录 深入浅出计算机组成原理 计算机的基本组成 硬件设备组成 CPU 内存 主板 I/O 设备 硬盘 显卡 冯.诺依曼体系结构 运算器/处理器单元 控制器 存储器 输入设备 ...

  6. 从GFS到GPT,AI Infra的激荡20年

    导读 最近AIGC和LLM的浪潮层层迭起,大有把AI行业过去十年画的饼,一夜之间完全变现的势头.而AI Infra(构建AI所需的基础设施),也成了讨论的焦点之一.大众对AI Infra的关注点,往往 ...

  7. Kahan's summation Formula

    保持精度的小trick:Kahan's summation Formula 由于最近用GPU编程,涉及到了float数组,就不得不涉及精度问题.在 CPU 上进行计算时,我们使用 double(即 6 ...

  8. Summation Order

    This note is for my students (first year) who got confused in class when I showed the proof of theor ...

  9. Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树

    传送门 文章目录 题意: 思路: 题意: 思路: 首先肯定不能模n!n!n!,所以考虑先将a,ba,ba,b做一个逆康托展开,得到a′,b′a',b'a′,b′数组,以及a′+b′=suma'+b'= ...

最新文章

  1. 论文:贝叶斯优化算法和应用综述(2)--概率模型和采集函数的介绍以及综述列表
  2. isContinuous 反色处理
  3. CSS盒子模型(border、padding、margin、圆角边框、盒子阴影、文字阴影、新闻列表综合案例、新浪导航栏案例)
  4. 物理引擎demo (4) —— 力、关节和马达
  5. linux内核网络协议栈--数据包的网卡驱动收发包过程(二十五)
  6. DIP第十章习题解答
  7. android p 权限流程,Android native 权限控制流程
  8. linux系统配置脚本,Linux系统配置脚本开机自启
  9. 并发模型之——共享内存模型(线程与锁)理论篇
  10. mobaxterm设置中文界面_如何使用MobaXterm打开WSL2的GUI程序
  11. (补)2021.1.22
  12. cad在哪里设置图幅大小_CAD新建图纸怎么设置视图范围太小?
  13. 记录 FPGA加速器设计CNN(论文笔记)
  14. 龙卷风收音机android安卓版,龙卷风收音机
  15. 公交查询系统Android源代码,公交查询源码
  16. 邢质斌退休意味着一个时代的结束
  17. UIKit基础:6.UIView的常用属性 - SuperView和SubViews基本认识
  18. 国产化系统改造实践(未完)
  19. SMT贴片元件拆卸的妙招分享
  20. 地方门户类网站建设解决方案

热门文章

  1. 学算法怎么样?算法工程师薪资前景好吗?
  2. javascript 模板_了解JavaScript中的模板文字
  3. 记录一下我在lubuntu里面用到的工具
  4. windows7隐藏桌面计算机,win7小技巧之隐藏桌面图标
  5. MATLAB与高等数学--极限计算
  6. java课程结课论文,语言课程论文范文
  7. Charles的基本使用方法
  8. 谷歌安装插件Fatkun 批量保存网页图片
  9. 冒泡排序和纯指针的冒泡排序
  10. Spring Boot 3.0.0-M1 Reference Documentation(Spring Boot中文参考文档) 9-16