2012-11-18 74 views
0

我似乎無法找出爲什麼下面的代碼被打破的原因:升頻和比較

從我的角度看會發生什麼是整數lbnd降低

public class Test { 
    public static void main(String[] args) { 
     methode1(); 
    } 
    static void methode1() { 
     int ubnd = Integer.MAX_VALUE; 
     int lbnd = ubnd; 

     while ((float)lbnd == (float)ubnd) { 
      --lbnd; 
     } 
     System.out.println((++lbnd) + ".." + ubnd); 
    } 
} 

的事情是,這循環應該是我看到的無限循環,但是它會在64循環之後中斷,因爲ints的值發生了變化。結果是:

2147483584..2147483647

,但它應該是一個無限循環使用:

2147483647..2147483647

+0

對不起,我添加了這個問題* – user1213904

+0

'upscaling'是什麼意思? – jlordo

+0

感謝所有,拿到現在 – user1213904

回答

2

記住浮子沒有足夠的精度來存儲所有32位精確的整數。因此,對於浮點比較來說,對於一個高數量級的整數,(float)i和(float)(i-1)是相同的。 (順便說一句,比較一個int和一個浮點數時,它將被當作浮點數比較,所以爲了說明一個額外的問題,你甚至不需要在你的==比較的一邊浮點數。 )

+0

啊好吧我明白了,但是爲什麼程序沒有2147483640.時四捨五入,這將給予的2.14748364,而不是2.14748365 – user1213904

+0

記住,計算機不「想」十進制,雖然打破。發生的實際舍入誤差位於基礎二進制文件中。 –

+0

好的謝謝,現在明白了 – user1213904

0

要驗證尼爾·科菲的出色答卷,你可以看看有額外的輸出代碼的輸出:

while ((float)lbnd == (float)ubnd) { 
     System.out.println(
       "Lower Int " + lbnd 
       + " Lower Float " + (float)lbnd 
       + " .. Upper Int " + ubnd 
       + " Upper Float "+ (float)ubnd); 
     --lbnd; 
    } 
    System.out.println((++lbnd) + ".." + ubnd); 
+1

我認爲打印lbnd和ubnd的確切整數值更加有趣。您可以在每次迭代中看到lbnd減1,直到它足夠小,以使其浮點轉換髮生變化。 –

0

對於大整數,數個整數塊周圍相同的浮動,所以對於首先幾次迭代,lbnd的float轉換仍然等於ubnd的float轉換。

在此之後,從lbnd足夠INT減法,它足夠小,以映射到下一個較低的浮點值,和兩個浮動轉換成爲不同,停止循環。

0

您正在遞減並遞增lbnd。這表明一個差異。其中一個是唯一有意義的(在strictfp浮點數),最大數量爲16777217.如果你的虛擬機具有較高的精度(non-strictfp),數字可能會更高。