0

私はJavaを初めて使用します。私のプログラムは、可能な限り効率的ではない可能性がありますが、次のとおりです。

public class Compute {
public static void main(String[] args) {
    for(double i = 10000; i <= 100000; i += 10000)
    {
        System.out.println("The value for the series when i = " + i + " is " + e(i));
    }
}
public static double e(double input) {
    double e = 0;
    for(double i = 0; i <= input; i++)
    {
        e += 1 / factorial(input);
    }
    return e;
}
public static double factorial(double input) {
    double factorial = 1;
    for(int i = 1; i <= input; i++)
    {
        factorial *= i;
    }
    return factorial;
}
}

これは、i = 10000、20000、...、および 100000 の値 e を計算すると思います。
ここで、e = 1 + (1/1!) + (2/2!) + ... + (1/i!)
これには約 47 秒かかりますが、うまくいくと思います。

私の問題は、すべての i について、結果が常に 0.0 であることです
。これは、メソッド factorial が呼び出されるたびに、戻り値が大きすぎて保存できず、何らかの問題が発生するためだと思います。

Factorial メソッドによって返された値を格納するにはどうすればよいですか?

4

3 に答える 3

3

で任意精度の結果を計算できますが、 eの級数展開ではBigDecimalを計算する必要はありません。系列の 20 番目の項 ( ) の大きさは約 10 -19であるため、全体の合計に対するその寄与は重要ではありません。100000!20/20!

言い換えれば、20 番目以降の項の寄与は、小数点以下 19 番目以降の桁のみを変更します。

于 2013-10-17T01:54:52.733 に答える
2

おそらくjava.math.BigInteger、階乗を格納するために使用する必要があります。

于 2013-10-17T01:38:41.557 に答える
-1

これを変える

e += 1 / factorial(input);

e += 1 / factorial(i);

コードを高速化するためにやるべきことはたくさんあります。(i+1) について考えてみましょう。vs i!、階乗全体を毎回再計算しないでください。

また、ジムが言ったように、必要な精度よりも答えの変化が少ない場合は計算をやめてください。

于 2013-10-17T02:07:19.763 に答える