2012-12-10 31 views
1

我正在Java中實現pow函數,我想知道我們如何處理Integer.MIN_VALUE作爲指數?我們只是把它當作一種特殊情況嗎?以Integer.MIN_VALUE作爲指數的Java pow實現

因爲我試圖將結果與標準的Java.lang.Math API進行比較,我得到了幾個不同的結果。以下是比較

//this will print "1.0 vs 0.0" 
System.out.println(pow(2,Integer.MIN_VALUE) + " vs " + Math.pow(2,Integer.MIN_VALUE)); 

//this will print "1.0 vs 1.0" 
System.out.println(pow(1,Integer.MIN_VALUE) + " vs " + Math.pow(1,Integer.MIN_VALUE)); 

public double pow(double base, int exp){ 
    double result = 1.0; 
    boolean pos = false; 

    if(exp == 0) return result; 
    if(exp > 0){ 
     pos = true; 
     exp *= -1; 
    } 

    while(exp > 0){ 
     if((exp & 1) == 1){ 
      result *= base; 
     } 
     base *= base; 
     exp /= 2; 
    } 
    if(!pos){ 
     result = 1/result; 
    } 
    return result; 
} 

,所以我想知道如果Integer.MIN_VALUE的是我必須有一個if語句來檢查它的特殊情況列表。

if(exp == Integer.MIN_VALUE && base > 1) return 0.0; 
+1

這真的取決於你已經註釋掉實施... –

+0

它只是把代碼回 – peter

+1

'(-1)* Integer.MIN_VALUE的==整數.MIN_VALUE'。所以在這種情況下,你的'while'循環不會運行。 –

回答

2

基於這一行:

exp *= -1; 

看來,它可能是一個特例。沒有這種特殊情況,肯定有方法來實現這一點,但是因爲-1 * Integer.MIN_VALUE不能存儲在一個int中,所以如果你不單獨處理它,你會得到一個bug。

+0

如果我在這種情況下分配並投入很長時間,它會有所幫助嗎? – peter

+0

是的,這可能有幫助。 –

0

是的,你有問題,Integer.MIN_VALUE * -1 == Integer.MIN_VALUE。你可以特殊處理它,或者你可以用另一種方式處理它。事實上,一種可能的解決方案是在積極時exp爲負,而不是其他方式;你只需使用-exp而不是exp

+0

如果使用-exp,那麼我們不能使用位移正確嗎?因爲ext >> = 1最終會以-1結束而不是0,所以我們必須使用exp/= 2. – peter

+0

您可以使用'>>>'而不是'>>',這可以工作。 –

+0

我認爲與無符號的右移,負面的exp會變成正面的,並沒有工作,因爲我試了一下 – peter

0

在我的系統有

-2147483648 
2147483647 

分別Integer.MIN_VALUEInteger.MAX_VALUE。所以,你應該看到這個問題在該行

exp *= -1; 
+0

每個系統都會有這些值。它獨立於平臺。 – erickson