诊断NaN的原因

时间:2011-11-17 05:50:24

标签: java arrays nan

我希望按列对2D数组求和,如果e[i][j]的值大于0,则计算并求和。但我不知道输出是NaN, 我该如何解决这个问题?

public class d_2DArray {

    public static void main(String [] args){



      double[][] e=   {{0.0,0.0,0.0,0.0},
                        {0.0,0.6,0.0,0.0},
                        {0.0,0.2,0.5,0.1},
                        {0.0,0.2,0.5,0.4},
                        {0.0,0.2,0.5,0.7},
                        {0.0,0.0,0.0,0.9}};



        double[] avg= new double[4];  
        double[] sum= new double[4];
        int i,j,k=0;
        int[][] x=new int [6][4] ;

            //average of column  


        for(j=1;j<e[1].length;j++){   


            sum[j]=0.0;

             for( i= 1; i < e.length; i++)

            if(x[i][j]==1){
                sum[j] +=e[i][j];
                k++;
        }
        avg[j]= sum[j]/k ; 

          System.out.println("Average j="+avg[j]);  

        }



    }
}

4 个答案:

答案 0 :(得分:1)

此处k的值在程序结束时保持为0,因此将0除以0会得到NaN。

答案 1 :(得分:1)

这个代码对于一个简单的答案几乎有太多问题。

  1. 在Java中,数组索引从0开始而不是1,因此for循环必须从0到长度
  2. 您永远不会将X设置为任何内容,因此if(x[i][j]==1)永远不会成立
  3. 由于#2,k从不递增,所以sum[j] / k总是0/0,即NaN

答案 2 :(得分:0)

首先,如果要读取所有数组,for循环的索引应该从0开始而不是1。

在这一行

if(x[i][j]==1){
        sum[j] +=e[i][j];
        k++;
}

你说你只会在x [i] [j] == 1时求和,但是你还没有用任何值初始化那个数组。因此k永远不会更新,所以最后你除以0,这就是为什么你得到NaN

答案 3 :(得分:0)

第一个问题是

   if(x[i][j]==1){
                    sum[j] +=e[i][j];
                    k++;
            }

条件永远不会满足。当你初始化数组x时,它是一个原始数组,并且每个x都被初始化为0.0,现在上面的条件永远不会满足,所以sum的数组永远不会更新。这意味着sum arrray的每个元素也被初始化为零。最后,当你除0/0时,结果si Nan(k从不增加,条件永远不会满足)