我是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,...,&amp;的值e。 100000
其中e = 1 +(1/1!)+(2/2!)+ ... +(1 / i!)
这需要大约47秒,但我相信它有效。
我的问题是,对于每一个我,结果总是0.0
我相信这是因为每当调用方法factorial时,返回值太大而无法存储,从某种程度上会导致问题。
如何存储Factorial方法返回的值?
答案 0 :(得分:3)
虽然您可以使用BigDecimal
计算任意精度结果,但无需为 e 的系列展开计算100000!
。考虑到系列中的第20个项(20/20!
)具有大约10 -19 的大小,因此它对总体贡献的贡献是微不足道的。
换句话说,20日之后任何条款的贡献只会改变小数点后第19位的数字。
答案 1 :(得分:2)
您应该使用java.math.BigInteger
来存储阶乘。
答案 2 :(得分:-1)
更改此
e += 1 / factorial(input);
到
e += 1 / factorial(i);
要加快代码速度。想想(i + 1)! vs i !,不要每次都重新考虑整个因子。
同样停止计算,当答案的变化小于吉姆所说的所需精度时。