2017-03-07 14 views
0

Math.powのマニュアルコードを書き込もうとしています。また、BigDecimalデータ型を使用しているため、後で非常に小さな値で作業する予定です。Manual Math.pow JavaでBigDecimalを使用する

私はこのコードをmath.powに渡してから、私はBigDecimalに変換しようとしました。

public static double power(double base, int exponent) { 
double ans = 1; 
if (exponent != 0) { 
    int absExponent = exponent > 0 ? exponent : (-1) * exponent; 
    for (int i = 1; i <= absExponent; i++) { 
     ans *= base; 
    } 

    if (exponent < 0) { 
     // For negative exponent, must invert 
     ans = 1.0/ans; 
    } 
} else { 
    // exponent is 0 
    ans = 1; 
} 

return ans; 
} 
} 

私はBigDecimalのにダブル、int型のデータ型を変換し、あまりにもそれに応じてコードを変更しようとしましたが、どういうわけか、私は正しい結果を得ることはありません。

public static BigDecimal powerBig(BigDecimal base, BigDecimal exponent) { 

    BigDecimal ans= new BigDecimal(1.0); 
    BigDecimal k= new BigDecimal(1.0); 
    BigDecimal t= new BigDecimal(-1.0); 
    BigDecimal no= new BigDecimal(0.0); 

    if (exponent != no) { 
     BigDecimal absExponent = exponent.signum() > 0 ? exponent : t.multiply(exponent); 
     for (int i = 1 ; i <= absExponent.signum(); i++) { 
      ans =ans.multiply(base); 
     } 

     if (exponent.signum() < 0) { 
      // For negative exponent, must invert 
      ans = k.divide(ans); 
     } 
    } else { 
     // exponent is 0 
     ans = k; 
    } 

    return ans; 
} 

私は

BigDecimal check = new BigDecimal (4.0); 
BigDecimal Euler = new BigDecimal (2.7182818); 

    powerBig(Euler,check); 

上でそれを実行しようとしていますが、私は出力として得るすべてはtehのオイラー値です。誰かが私のコードにあるエラーで私を助けることができますか?

コードは指数タイプを変更した後

public static BigDecimal powerBig(BigDecimal base, int exponent) { 

    BigDecimal ans= new BigDecimal(1.0); 
    BigDecimal k= new BigDecimal(1.0); 
    //BigDecimal t= new BigDecimal(-1.0); 
    //BigDecimal no= new BigDecimal(0.0); 

    if (exponent != 0) { 
     int absExponent = exponent > 0 ? exponent : (-1)*exponent; 
     for (int i = 1 ; i <= absExponent; i++) { 
      ans =ans.multiply(base); 
     } 

     if (exponent < 0) { 
      // For negative exponent, must invert 
      ans = k.divide(ans); 
     } 
    } else { 
     // exponent is 0 
     ans = k; 
    } 

    return ans; 
} 
+2

'指数を置くことができますので、お尻が捕虜機能を持っている= no'! - あなたはこれが何を思いますか? 'equals'でも' BigDecimal'と一緒に動作しないのですが、どうして '=='と思うでしょうか? –

+0

私はそれをexponent.signum()> 0に変更しましたが、まだ動作していません – Saad

+0

['BigDecimal.sigNum()'は '{-1,0,1}'を返します(http://docs.oracle.com (int i = 1; i <= absExponent.signum(); i ++) 'は何ですか?つまり、あなたのコードをデバッグしてください - 問題はすべて注意の欠如からです... –

答えて

1

あなたの問題はBigDecimal.sigNum()は1、0または-1数がゼロ、正または負である場合absExponentに返すことであるintに走ります。シグナムは()オールウェイズあなたのループはこのバージョンでは、オイラーの例で働いたことが

を実行しています最初の時間で終了します1を返します

public static BigDecimal powerBig(BigDecimal base, BigDecimal exponent) { 

    BigDecimal ans= new BigDecimal(1.0); 
    BigDecimal k= new BigDecimal(1.0); 
    BigDecimal t= new BigDecimal(-1.0); 
    BigDecimal no= new BigDecimal(0.0); 

    if (exponent != no) { 
     BigDecimal absExponent = exponent.signum() > 0 ? exponent : t.multiply(exponent); 
     while (absExponent.signum() > 0){ 
      ans =ans.multiply(base); 
      absExponent = absExponent.subtract(BigDecimal.ONE); 
     } 

     if (exponent.signum() < 0) { 
      // For negative exponent, must invert 
      ans = k.divide(ans); 
     } 
    } else { 
     // exponent is 0 
     ans = k; 
    } 

    return ans; 
} 

のBigDecimal CLあなたは、単純な維持したい場合は、あなただけの

BigDecimal Euler = new BigDecimal (2.7182818); 
Euler.pow(4); 
+1

指数が整数でない場合、これはひどく壊れます。だから、なぜBigDecimal.powを使わないのですか? –

+0

'else-clause'が実行される可能性はありますか?新しいオブジェクトで 'no'が作成されている限り、' no!= exponent'は常にtrueになります。 –

関連する問題