为什么我得到 "NaN" 作为 Outprint`?

Why do I get "NaN" as Outprint`?

我想用 Java 计算圆周率。与 S. Ramanujan formel.

这是我的代码:

public class PiV5 {
public static void main(String[] args) {
int a = 4;
double pi = 0;
int b = 3;
int fakult = 3;

int x = 3; 
long y = 1;
    for (int i =1; i <= 50; i++) {
        int n = i*4; 
        long fakultaet = 1;
        long fakultae2 = 1; 
        int bh = i;
        for (int g=1; g<=n; g++) {fakultaet = fakultaet * g;}
        for (int l=1; l<=bh; l++) {fakultae2 = fakultae2 * l;}

        pi = ((fakultaet * (1103 + (26390*i)))/Math.pow(fakultae2, 4) * Math.pow(396, 4*i));

    };
        System.out.println("Pi nach ein paar Rechnungen: " + (Math.sqrt(8)/9801)*pi);

    }
}

感谢你的帮助,如果你能帮助我的话

正如 Andreas 在评论中提到的那样,此计算会导致数字溢出,因为即使对于长数据类型,值也会变大。

您现在可以使用您的算法执行的最大步骤是 5,因为 20! = 243290200817664000021! = -4249290049419214848 是由数字溢出引起的。

但即便如此,您的代码中还是有一点错误,因为您忘记了对循环中的值求和:

pi += ((fakultaet * (1103 + (26390 * i))) / Math.pow(fakultae2, 4) * Math.pow(396, 4 * i));

为了获得更好的准确性,还可以对常量值使用双精度值:

pi += ((fakultaet * (1103d + (26390d * i))) / Math.pow(fakultae2, 4) * Math.pow(396, 4 * i));

使用它进行 5 次迭代将产生以下结果:

Pi nach ein paar Rechnungen: 4.0513767058512194E63

这对 PI 来说不是一个很好的结果。

要改进它并获得更高的准确性,您可以使用 BigDecimal class.