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 返回的值?

4

3 回答 3

3

虽然您可以使用 计算任意精度结果BigDecimal,但无需计算e100000!的级数展开式。考虑到系列中的第 20 项 ( ) 的大小约为 10 -19,因此它对整体总数的贡献是微不足道的。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 回答