一尘不染

在所有值的总和超过double的限制时,如何计算平均值的一个好的解决方案是什么?

algorithm

我需要计算非常大的双精度数(10 ^ 9值)的平均值。值的总和超过了两倍的上限,那么有人知道不需要任何巧妙的小技巧就能计算平均值,而又不需要计算总和吗?

我正在使用Java 1.5。


阅读 199

收藏
2020-07-28

共1个答案

一尘不染

您可以迭代计算平均值。该算法简单,快速,您只需处理每个值一次,并且变量永远不会大于集合中的最大值,因此不会溢出。

double mean(double[] ary) {
  double avg = 0;
  int t = 1;
  for (double x : ary) {
    avg += (x - avg) / t;
    ++t;
  }
  return avg;
}

循环内部avg始终是到目前为止已处理的所有值的平均值。换句话说,如果所有值都是有限的,则不应溢出。

2020-07-28