Java:当用阶乘除法时,我如何存储阶乘?它太大而不能加倍

时间:2013-10-17 01:36:25

标签: java series

我是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方法返回的值?

3 个答案:

答案 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 !,不要每次都重新考虑整个因子。

同样停止计算,当答案的变化小于吉姆所说的所需精度时。