0

私はAndroidで電卓アプリケーションを開発しています。

私は電卓を開発し、階乗関数を除いてうまく機能しています。

階乗を計算する関数は次のとおりです。

public float factorial (float n){
    float ans=1;
    for (int i=1; i<=n; i++){
        ans=ans*i;
    }
    return ans;
}

問題は、34!私が正しい答えを得ると思うまでです。

34!=2.952328229965333E38

しかしn>=35、私は答えを得る

n!=Infinity

これはフロートオーバーフローによるものだと思います。float少なくとも言う範囲を広げるにはどうすればよいですか10^100.

ありがとうございました。

4

4 に答える 4

4

JLSで設定されているため、Javaプリミティブ型の範囲を拡大することはできません。あなたの場合、より多くの範囲を取得するためにdoubleを使用するか、任意に大きい数に対してBigDecimalを使用することができます

于 2012-12-31T08:12:54.780 に答える
2

絶対精度を気にしない場合は、(およそ)と同じ大きさのdoubleを使用できます1.8 * 10^308

精度が懸念される場合は、BigDecimalまたはBigIntegerを使用する必要があります(階乗は整数関数であり、この場合、BigIntegerはBigDecimalよりも効率的です)。

于 2012-12-31T08:14:25.090 に答える
2

拡張浮動小数点範囲doubleの代わりに使用します。float

精度が懸念される場合は、浮動小数点型を使用しないでください。どちらdoubleでもないfloatBigIntegerを使用します。ただし、この場合は、質問も修正してください。正解34 != 2.952328229965333E38ではありません。

于 2012-12-31T08:14:34.967 に答える
1

階乗関数のように単純なもののために車輪を再発明する必要はありません。

GoogleのGuavaライブラリを使用します。YoutubeGoogleSearch (Google自体から)などのAndroidアプリはGuavaを使用します。

double f = DoubleMath.factorial(n);

n = 170までの入力を受け入れ、それを超えると。を返しますDouble.POSITIVE_INFINITY

于 2015-02-09T05:47:45.153 に答える