double在0/0之后取值NaN

时间:2013-12-15 11:36:59

标签: java double

我有这个类适用于一系列图像的像素

    private int makeRSR(int x, int y)
    {   
      double bRed = 0;double bGreen = 0; double bBlue = 0;
      for(int k: sequence.keySet())
      {
        BufferedImage img = sequence.get(k);
        for(int i=0; i<iteration; i++){ 
            for(int j=0;j<spray_int; j++){ 
                int dist= ((int)(dis_int*Math.random()));
                double theta=((int)(361*Math.random())) ;
                double inc_x=dist * Math.cos((theta*(Math.PI/180)));
                double inc_y=dist * Math.sin((theta*(Math.PI/180)));
                int row=Math.abs((int)(inc_y+y));
                int column=Math.abs((int)(inc_x+x));
                if(row<1 || column<1 || row>altI-1 || column>largI-1){
                    row=Math.abs((int) ((altI-1)*Math.random()));
                    column=Math.abs((int) ((largI-1)*Math.random()));
                }
                Color c = new Color(img.getRGB(column,row));
                red.add(c.getRed());
                green.add(c.getGreen());
                blue.add(c.getBlue());
            }
            Color c = new Color(img.getRGB(x,y));
            red.add(c.getRed());
            green.add(c.getGreen());
            blue.add(c.getBlue());

            double maxR=max(red);
            double maxG=max(green);
            double maxB=max(blue);

            bRed += ((((double)c.getRed()) / (maxR))*255.00);
            bGreen += ((((double)c.getGreen()) / (maxG))*255.00);
            bBlue += ((((double)c.getBlue()) / (maxB))*255.00); 

            red.clear();green.clear();blue.clear();
        }
    }

    redValue=0;greenValue=0;blueValue=0;
    redValue= (int) (bRed/(iteration*(sequence.size())));
    greenValue= (int) (bGreen/(iteration*(sequence.size())));
    blueValue=(int) (bBlue/(iteration*(sequence.size())));

    bRed=0.0;bGreen=0.0;bBlue=0.0;

    return new Color(redValue,greenValue,blueValue).getRGB();
}

问题在于有时c.getRed()和maxR都是0(对于其他通道都相同)因此bRed丢失其内容并取值NaN,并且它永远不会改变。是否有错误,我错过了什么,或者我是否必须通过添加支票来阻止0/0? 谢谢,再见

2 个答案:

答案 0 :(得分:3)

由于0/0是未定义的数字,您需要决定如何对待它。

  1. 找出为什么你得到0当前和最大红色值并防止它。
  2. 如果c.getRed()maxR都为0,则将除法结果设置为0(或您决定获得预期结果的任何数字)。

答案 1 :(得分:1)

因为除以零是一个错误,它会产生NaN,它代表非数字。涉及NaN的后续操作也会产生NaN,这就是为什么它的值永远不会改变的原因。

你应该在分裂前明确检查零除数,以防止除零。