2013-11-28 45 views
1

我caluclating兩種顏色直方圖分別是3個維數組之間的區別:爲什麼*運營商提供給錯誤的結果並Math.pow()正確

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])); 

在這一個以上someties的結果我得到負數,這在數學上是不可能的。 當不使用*我用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); 

我得到正確的結果。爲什麼這樣?

+5

你的號碼不適合'int'。 – SLaks

+0

@SLaks即使這些數字沒有意義,我們仍然有x * x> = 0。 – Yoda

+1

'deltaH'的類型是什麼? – Szymon

回答

4

當你乘以兩個int時,你可能會溢出。 Math.pow函數會將其參數先轉換爲double - 一旦您擁有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