[英]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.