如何使用Math.pow查找整数数组的几何平均数

时间:2013-05-08 21:17:24

标签: java arrays

我试图使用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吗?

5 个答案:

答案 0 :(得分:13)

从维基百科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);
    }
}

答案 1 :(得分:10)

您的geometric mean计算不正确。您必须将所有值相乘而不是添加它们。您的初始产品必须以1.0开头。

double product = 1.0;

以后......

product = product * data[i];

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

double geoMean = Math.pow(product, 1.0 / data.length);

答案 2 :(得分: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;
}

答案 3 :(得分:1)

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

sum = Math.pow(sum, 1.0 / data.length);

答案 4 :(得分:0)

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

def geomean(values: Double*): Double =
 math.exp((values.map(math.log(_)).sum) / values.length)