我很想计算一组给定数字的平均值和方差的平均值。平均值似乎运行良好,但我无法计算方差,结果始终为0.我很确定我的变量类型有些混乱:
int numRuns = 5;
ArrayList<Long> numbersOfIOs = new ArrayList<Long>();
.
.
.
long averageNumberOfIOs = 0;
for(Long io : numbersOfIOs){
averageNumberOfIOs+=io;
}
System.out.println("Average number of I/Os: "
+ (averageNumberOfIOs/numRuns)
+ " I/Os");
long varianceNumberOfIOs = 0;
for(Long io : numbersOfIOs){
double temp = Math.pow(2.0,(double)(io-averageNumberOfIOs));
varianceNumberOfIOs+=Math.round(Math.pow(2,(io-averageNumberOfIOs)));
}
System.out.println("Variance: " + (varianceNumberOfIOs/numRuns) + " I/Os\n");
我将temp放在那里仅用于调试目的,我发现它总是为0。
任何帮助都会受到重视
答案 0 :(得分:2)
averageNumberOfIOs
是您io
所有averageNumberOfIOs > io
的总和。
因此io-averageNumberOfIOs < 0
和0 < Math.pow(2,(io-averageNumberOfIOs)) << 1
。
因此,当进行路由时,您会获得varianceNumberOfIOs == 0
。
因此varianceNumberOfIOs/numRuns
等于0.
答案 1 :(得分:2)
您的代码中存在两个问题。
首先。变量averageNumberOfIOs
包含IO的总和,而不是平均值。
第二。要计算变量x
的平方,请使用Math.pow(x, 2.0)
,而不是代码中的Math.pow(2.0, x)
。
解决上述两个问题后,您将获得正确的结果。
你得到0的原因是这个。由于averageNumberOfIOs
包含IO的总和,因此无论(io-averageNumberOfIOs)
的值如何,表达式io
都是负数(可能是大的负数)。计算Math.pow(2.0, (io-averageNumberOfIOs))
意味着你计算2为大负数的幂,这产生一个非常接近于0的值。总结这个超过IO,你仍然得到0。
答案 2 :(得分:1)
此代码中的几个问题:
1)为了计算方差,你应该总结square of (x - average)
。您不能使用平均值,而是使用值的总和。
2)而不是数量的平方,而不是数量的幂。 Math.pow
的论点被交换了。
3)对Math.round
的调用会破坏结果。方差是一个实数。