为什么*运算符给出错误的结果和Math.pow()正确

时间:2013-11-28 03:39:06

标签: java math pow multiplying

我正在计算两个颜色直方图之间的差异,这是三维数组:

deltaHdouble

int[][][] t1 = item.getCh();
                    int[][][] t2 = comparedItem.getCh();
                    for(int i = 0; i < t1.length; i++)
                        for(int j = 0; j < t1[i].length; j++)
                            for(int p = 0; p < t1[i][j].length; p++)
                                deltaH = deltaH + ((t1[i][j][p] - t2[i][j][p]) * (t1[i][j][p] - t2[i][j][p]));

在上面的那个结果中,我得到了负数,这在数学上是不可能的。 当使用*代替我使用Math.pow()方法时:

  int[][][] t1 = item.getCh();
                        int[][][] t2 = comparedItem.getCh();
                        for(int i = 0; i < t1.length; i++)
                            for(int j = 0; j < t1[i].length; j++)
                                for(int p = 0; p < t1[i][j].length; p++)
                                    deltaH = deltaH + Math.pow(t1[i][j][p] - t2[i][j][p],2);

我得到了正确的结果。为什么会这样?

1 个答案:

答案 0 :(得分:4)

当你将两个int相乘时,你可能会溢出。 Math.pow函数将其参数转换为双重优先 - 没有溢出的风险,一旦你有double就会导致负数(虽然你可能仍然会溢出......但是数字要大得多)。

这实际上是@Slaks的评论所说的。我刚刚扩展了它。

编辑快速代码段显示这是真的:

for(ii = 0; ii >= 0; ii++) {
  jj = ii * ii;
  if(jj < 0) break;
}
System.out.printf("%d; %d\n", ii, jj);

打印出来

46341; -2147479015