Java:Math.pow()返回零

时间:2014-06-28 15:10:05

标签: java int double long-integer pow

我很想计算一组给定数字的平均值和方差的平均值。平均值似乎运行良好,但我无法计算方差,结果始终为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。

任何帮助都会受到重视

3 个答案:

答案 0 :(得分:2)

averageNumberOfIOs是您io所有averageNumberOfIOs > io的总和。

因此io-averageNumberOfIOs < 00 < 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的调用会破坏结果。方差是一个实数。