原文: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. 让你知道什么才是firefox4的速度.
  2. Learn from mistake, i.e. 和 e.g. 是不同的
  3. 导入torchvision出现:AttributeError: module ‘torch.jit‘ has no attribute ‘unused‘错误
  4. Java多线程同步Synchronized深入解析
  5. 前端学习(3170):react-hello-react之实现底部功能
  6. 宋浩 概率统计 笔记_推论统计分析学习笔记
  7. 洛谷 P2384 最短路题解
  8. cocos2d-x,求世界坐标
  9. jQuery-Selectors(选择器)的使用(一、基本篇)
  10. 微信小程序上传接口php,微信小程序API 上传、下载
  11. 人脸检测(五)--adaboost总结,整理
  12. u盘在磁盘管理可以显示 但是电脑中找不到_电脑无法识别U盘?5步操作让办公族轻松搞定!...
  13. AD封装库大全免费分享
  14. java pdf查看_Java检查PDF文件是否损坏
  15. WiFi能连上但是上不了网怎么办?
  16. 继口罩厕纸双黄连之后,限制出口会导致“粮食挤兑”吗?
  17. 记一次img标签图片不拉伸处理办法
  18. 设置sublime默认浏览器以及快捷键
  19. ubuntu 清空回收站
  20. 单片机实验三(D/A+DMA实验)

热门文章

  1. 如何关闭电脑的休眠功能
  2. 【机器学习】线性回归,多元线性回归、自回归及衡量指标
  3. 一名合格的拼多多运营需要具备哪些技能?
  4. Win10安装安卓模拟器入坑记
  5. 【友情链接NO.0000?】大佬们的博客(°ー°〃)
  6. 20200724-Java-抽象类、接口
  7. iOS开发证书不受信任
  8. 杰理-BLE连接后打开经典蓝牙
  9. 基于LD3320的51智能遥控语音小车
  10. 通达信资金净流入公式_通达信成交额资金净流入指标公式