13

次のコードを実行しようとすると

public class Main {
   public static void main(String[] args) {
       long a = (long)Math.pow(13, 15);
       System.out.println(a + " " + a%13);
   }
}

「51185893014090752 8」が得られます

13^15の正しい値は51185893014090757 です。つまり、 5Math.powによって返される結果よりも大きくなります。それを引き起こす可能性のあるもののアイデアはありますか?

4

6 に答える 6

11

倍精度浮動小数点値で使用可能な有効桁数 (~15 から 16) を超えました。それを行うと、結果の最下位桁が実際に意味のある/正確であるとは期待できません。

Java で任意の正確な演算が必要な場合は、 と の使用BigIntegerを検討してBigDecimalください。

于 2012-03-31T13:59:58.773 に答える
6

これは精度の問題ではありません。Math.pow メソッドは、結果の近似を実行します。正しい結果を得るには、次のコードを使用します。

long b = 13;
for(int i = 0; i != 14; i ++) {
    b = b * 13;
}
System.out.println(b);

出力は期待される結果 51185893014090757L です。

より一般的には、指数が整数の場合、Math.pow メソッドの使用を避ける必要があります。第一に、結果は概算であり、第二に計算コストが高くなります。

Math.pow (および Math クラスの他のほとんどのメソッド) の実装は、ネットワーク ライブラリ netlib をパッケージ「Freely Distributable Math Library」としてベースにしています ( StrictMath javadocを参照)。C での実装はe_pow.cで入手できます。

于 2014-02-18T11:51:56.463 に答える
0

double にキャストして long で桁を保持するという制限があるためです。float は可能かもしれませんが、いくつかのエラーが発生します。簡単な方法ではない配列に保存して、計算の桁を自分で処理する必要があります。

しかし、Python プログラミング言語では、任意の長さの結果を得ることができ、非常に強力です!

成功する!!!

于 2012-03-31T15:33:15.010 に答える