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