Java:Math.pow() 返回零

标签 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。

任何帮助将不胜感激

最佳答案

您的代码中有两个问题。

首先。变量 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/

相关文章:

c++ - 在 C++ 中将 4 个字符转换为 int

c# - 如何使用 if 条件来添加值

ios - 二元运算符 '<' 不能应用于类型 'Double?' 和 'Double' 的操作数

c - 将int写入c中的文件: getting weird character "\00"

list - 将整数列表显示为字符串

css - 如何删除侧面板和主体内容周围的边框线?

java - 匹配规则集与 Java 中的输入数据集

java - JButton 的范围超出其 native 类

java - UML:方法图而不是类图?

java - Java 中的 2D LinkedList.contains()