我需要计算非常大的双精度数(10 ^ 9值)的平均值。值的总和超过了两倍的上限,那么有人知道不需要任何巧妙的小技巧就能计算平均值,而又不需要计算总和吗?
我正在使用Java 1.5。
您可以迭代计算平均值。该算法简单,快速,您只需处理每个值一次,并且变量永远不会大于集合中的最大值,因此不会溢出。
double mean(double[] ary) { double avg = 0; int t = 1; for (double x : ary) { avg += (x - avg) / t; ++t; } return avg; }
循环内部avg始终是到目前为止已处理的所有值的平均值。换句话说,如果所有值都是有限的,则不应溢出。
avg