2

Math.pow を使用して、整数の小さな配列の幾何平均を見つけようとしています。この構文を使用するのはこれが初めてで、コードを完成させる方法がわかりません。

私は現在、過去数年間の試験問題に取り組んでおり、これは問題の 1 つです。

私のコードのエラーを許してください。私はまだ 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 に答える