Java欧拉数结果无穷大

Java Euler number result infinity

我尝试使用递归函数来计算Java中的欧拉数。当我在这个公式中输入小数字时没问题:

但是当我尝试输入更大的数字(例如 1000)时,我得到的是无穷大。 为什么会这样。我该如何解决它。

import java.util.Scanner;

public class enumber {
    public static long fact(int a) {
         if(a <= 1) {
             return 1;
         }
         return a * fact(a - 1);
    }

    public static double calculate(int i) {
        double cresult = Math.pow(fact(i), -1);
        if(i == 0 ) {
            return 1;
        }
        return cresult+calculate(i-1);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  
        System.out.println("Enter i value: ");
        int i = sc.nextInt();
        double eresult = calculate(i);
        System.out.println(eresult);
    }
}
 

输出;

    Enter i value: 
    1000
    Infinity

那是因为您尝试计算 1000 的阶乘....这是相当大的。 Factorial 1000

您尝试将其存储在一个长值中,但是长的 max 值远小于 1000!。基本装不下了

考虑使用class BigInteger (or BigDecimal),它在默认的java sdk中,您可以直接通过println()输出。

但是您已经知道结果,它是 e,因此您可能只需要为阶乘实现 Big-Class

您超出了 long 的容量。但我建议您决定 e.

需要多少精度

假设您希望它的误差小于 .0000001。继续 e 的迭代,直到您最近的计算与之前的计算之间的正增量小于或等于您的错误。

如果您想将其发挥到极致,可以随时使用 BigDecimal 来提高结果的准确性。

我使用循环解决了这个问题。对于旧算法,我将事实方法类型更改为 double。我摆脱了无限。之后,我面临“WhosebugError”。 What is a WhosebugError?

我的新算法是;

import java.util.Scanner;

public class enumber2 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double fact;
        double eNumber = 0;
        int i = in.nextInt();
        
        while(i>0) {
            fact=1;
            for(int j=1; j<=i; j++) {
                fact = fact * j;
            }
            eNumber = eNumber +(1.0/fact);
            i--;
        }
        eNumber = eNumber +1;
        System.out.println(eNumber);
    }

}

即使我在耐心等待后输入大数字,我也能毫无例外地得到结果。