我正在尝试计算给定一组数字的平均值和方差的平均值。平均值似乎运行良好,但我无法计算方差,结果始终为 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。
任何帮助将不胜感激
最佳答案
您的代码中有两个问题。
首先。变量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.
关于Java:Math.pow() 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468136/