大数求平均值公式

以下为整理手记:

方法1、

维护一个cnt记录当前数据的个数,evr记录当前的平均值
然后每增减一个新数据val时,更新这个cnt和evr的值即可
evr += ((val - evr) / ++cnt);

 

int main()
{
    int cnt = 0;
    double evr = 0;
    int i;

    double d[] = {1234.5678, 1.23, 454.42, 178674.5843, 343.99};

    //模拟,每产生一个数就更新这个cnt和evr
    for (i = 0; i < sizeof(d) / sizeof(d[0]); ++i)
    {
        evr = evr + ((d[i] - evr) / ++cnt);//防止相加导致溢出
    }
    cout<<evr<<endl;
    
    system("pause");
    return 0;
}


方法2、

设x为已有数据的平均数,n为已有数据的个数,新的数据为y
那么就是
(x * n + y)/(n+1) =( x * (n+1) - x + y )/(n+1) = x + (y-x)/(n+1);

x + (y-x)/(n+1);这样就简单了。用double 应该问题不大。 

其实结果是同方法1的。

 

参考出处:

http://topic.csdn.net/u/20111101/13/ad72da0e-7e1a-42ac-8b47-6f13ed873914.html

 


 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值