簡體   English   中英

Java:除以階乘時,如何存儲階乘? 太大,無法翻倍

[英]Java: When dividing by factorials, how do I store the factorial? Its too large to be double

我是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
我認為這是因為每當調用方法階乘時,返回值都太大而無法存儲,從而導致問題。

我該怎么辦才能存儲由階乘方法返回的值?

盡管您可以使用BigDecimal計算任意精度結果,但無需計算為100000! 用於e的級數展開。 考慮該系列中的第20個詞( 20/20! )的大小約為10 -19 ,因此它對總體的貢獻微不足道。

換句話說,第20位之后的任何術語的貢獻僅會改變第19位小數位后的數字。

您可能應該使用java.math.BigInteger來存儲階乘。

改變這個

e += 1 / factorial(input);

e += 1 / factorial(i);

加快代碼執行的工作很多。 考慮一下(i + 1)! 與我!,不要每次都重新計算整個階乘。

也要停止計算答案何時變化的幅度小於所需的精度,如Jim所說。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM