2

我正在尝试使用 Math.pow 找到一个小的整数数组的几何平均值。这是我第一次使用这种语法,我不知道如何完成我的代码。

我目前正在查看去年的试卷,这是其中一个问题。

请原谅我的代码中的任何错误。我还在学习Java。

public class AverageOfArray {

public static void main(String []args){

    int [] data = new int[3];
    data[0] = 2;
    data[1] = 4;
    data[2] = 8;

    int y = 0;
    int sum = 0;
    for(int i = 0; i < data.length; i++){
        sum = sum + data[i];
        y++;
    }

    Math.pow(sum, 1.0/data.length);
    System.out.println(sum);

}

}

尽管代码运行良好且没有错误,但它并没有给我所需的输出。平均值应该是 4。

这是经过一些编辑后的代码:

public class AverageOfArray {

public static void main(String []args){

    int [] data = new int[3];
    data[0] = 2;
    data[1] = 4;
    data[2] = 8;


    double sum = 1.0;

    for(int i = 0; i < data.length; i++){
        sum = sum * data[i];
    }

    double geoMean = Math.pow(sum, 1.0/data.length);
    System.out.println(geoMean);

}

}

但是它现在返回 3.9999996?我现在在这里看 Math.abs 吗?

4

5 回答 5

14

从维基百科https://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_arithmetic_mean_of_logarithms,实现几何平均公式的不同(但等效)版本是很常见的。该版本使用对数来避免上溢和下溢。在 Java 中,它可能看起来像这样:

class GeometricMean {
    private GeometricMean() {}

    public static void main(String[] args) {
        long[] data = new long[]{2, 4, 8};
        double gm = geometricMean(data);
        System.out.println("Geometric mean of 2, 4 and 8: " + gm );
    }

    public static double geometricMean(long[] x) {
        int n = x.length;
        double GM_log = 0.0d;
        for (int i = 0; i < n; ++i) {
            if (x[i] == 0L) {
                return 0.0d;
            }
            GM_log += Math.log(x[i]);
        }
        return Math.exp(GM_log / n);
    }
}
于 2014-02-06T09:08:48.917 回答
12

您的几何平均数计算不正确。您必须将所有值相乘而不是相加。而且您的初始产品必须从 1.0 开始。

double product = 1.0;

然后...

product = product * data[i];

此外,将 的结果存储Math.pow在一个新变量中 - a double,因为这就是Math.pow返回的结果。

double geoMean = Math.pow(product, 1.0 / data.length);
于 2013-05-08T21:19:26.520 回答
4
public static double geoMean(double[] arr) {

    if (arr.length == 0) {
        return 0.0;
    }

    double gm = 1.0;
    for (int i = 0; i < arr.length; i++) {
        gm *= arr[i];
    }
    gm = Math.pow(gm, 1.0 / (double) arr.length);

    return gm;
}
于 2013-05-08T21:20:16.393 回答
1

您的代码有几个问题。首先,您需要将值相乘以获得几何平均值。那么,简单地调用Math.pow不会改变值;它返回一个您必须捕获的新值。例如:

sum = Math.pow(sum, 1.0 / data.length);
于 2013-05-08T21:20:50.420 回答
0

在 Scala 中,您可以使用以下日志总和(以防止溢出)来实现它:

def geomean(values: Double*): Double =
 math.exp((values.map(math.log(_)).sum) / values.length)
于 2018-04-30T18:19:30.783 回答