您的位置:首页 > 编程语言 > C语言/C++

求均值和均方差不溢出的方法

2016-10-21 13:40 141 查看
均值公式: x¯=∑ni=1xin

求解思路:

x¯0=0

for i = 1 : n

x¯i=x¯i−1+(xi−x¯i−1)i

end

方差公式:X=∑ni=1(xi−x¯)2n−1=∑ni=1x2in−1−n∗x¯2n−1

求解思路:

X2=x21+x22

for i = 3 : n

Xi=Xi−1+(x2i−Xi−1)i−1

end

代码实现:

方法一:

#include<iostream>
#define POW(x) ((x)*(x))
using namespace std;
double GetAvr(int* a, int n)
{
double avr = 0;
for (int i = 0; i < n; i++)
{
avr += (a[i] - avr) / (i + 1);
}
return avr;
}
double GetVar(int *a, int n, double avr)
{
double var = POW(a[0] - avr) + POW(a[1] - avr);
for (int i = 2; i < n; i++)
{
var += (POW(a[i] - avr) - var) / (i);
}
return var;
}


方法二:

void GetAvrandVar(int *a, int n, double& avr, double& var)
{
avr = 0, var = 0;
for (int i = 0; i < n; i++)
{
avr += (a[i] - avr) / (i + 1);
if (i < 2)
{
var += POW(a[i]);
}
else
{
var += (POW(a[i]) - var) / i;
}
}
var -= n*POW(avr) / (n - 1);
}


测试代码:

int main()
{
int a[5] = { 1,22, 77, 7, 8 };
double avr, var;
double avr1, var1;
avr = GetAvr(a, 5);
var = GetVar(a, 5, avr);
GetAvrandVar(a, 5, avr1, var1);
cout << "avr1: " << avr1 << endl;
cout << "avr2: " << var1 << endl;
cout << "avr: " << avr << endl;
cout << "var: " << var << endl;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息