我正在计算两个颜色直方图之间的差异,这是三维数组:
deltaH
是double
。
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);
我得到了正确的结果。为什么会这样?
答案 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