在我的for循环中返回无穷大?

时间:2016-02-23 00:16:27

标签: java android

现在,当我运行我的代码时,它会在std dev和variance中返回无穷大。我该如何解决这个问题?

当我从// VARIANCE和// STD DEV中取出for循环时,它给了我一个值,但它不是正确的值。因此,我认为这是因为当你把它从for循环中取出时我会#34; i"是不是正常工作?我知道"我"是问题,因为它应该是数字列表中元素的数量,取每个元素并减去平均值并将其平方。"我如何实现它?

@Override
public String calculate() throws Exception {
    //String firstConfidenceInterval = String.valueOf(SRC_Calc_Type.CI(PH, CV, N));
    double total = 0.0;
    double total1 = 0.0;
    int i;
    String delims = ",";
    String[] tokens = nums.split(delims);

    for(i = 0; i < tokens.length; i++) {
        total += (Double.parseDouble(tokens[i]));// SUM
    }
    double average = total / i; //average
    total1 += (Math.pow((i - average), 2) / i); //VARIANCE
    double std_dev = Math.pow(total1, 0.5); //STDDEV

    return String.valueOf("Sum: " + total + //Works
            "\nMean: " + average + //Works
            "\nStandard Deviation: " + std_dev + //works
            "\nVariance: " + total1); //works
    //"\nNumbers Sorted: " + "( " +  " )"
}

3 个答案:

答案 0 :(得分:0)

在循环外的任何地方将i替换为tokens.length()。在futute中,为了避免这样的错误,总是在声明变量时初始化变量,并始终在最窄的范围内声明它们。在这种情况下fot(int I=0 ...。请注意,您的方差公式是错误的。这不是你计算机方差的方式。

答案 1 :(得分:0)

您需要第二个循环来计算方差

double variance=0;
for(String token : tokens) {
  double value = Double.parseDouble(token);
  variance += Math.pow(value-average,2);
}
variance = variance/tokens.length;

答案 2 :(得分:0)

您误解了如何计算方差和标准差。您不会从元素数中减去平均值。

您需要从均值计算每个样本的差异,将它们全部平方,然后添加所有正方形。

double variance = 0.0;
for (i = 0; i < tokens.length; i++)
{
    // It would be better to parse the tokens once and
    // place them into an array; they are referenced twice.
    double diff = Double.parseDouble(tokens[i]) - average;
    variance += diff * diff;
}
// of (tokens.length - 1) for "sample" variance
variance /= tokens.length;

然后你可以取平方根作为标准偏差。

double std_dev = Math.sqrt(variance);