相应的递推公式:
其中En由平均值的递推公式替代可得代码中的表达式
package method;
/*累加器的方差
(与直接对所有数据的平方求和的方法相比较,能更好的避免四舍五入产生的误差)
*/
public class Accumulator
{
private double m;
private double s;
private int N;
public void addDateValue(double x)
{
N++;
s=s+1.0*(N-1)/N*(x-m)*(x-m);
m=m+(x-m)/N;
}
public double mean()
{
return m;
}
public double var()
{
return s/(N-1);
}
public double stddev()
{
return Math.sqrt(this.var());
}
}
进行调用
package method;
import java.util.Scanner;
/*
*/
public class TestAccumulator
{
public static void main(String[] args)
{
Accumulator accumulator=new Accumulator();
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++)
{
accumulator.addDateValue(sc.nextDouble());
}
System.out.println(accumulator.mean()+" "+accumulator.var());
}
}
3
7
8
9
8.0 1.0
参考博客: