为什么我得到“ NaN”作为Outprint`?

时间:2019-03-16 22:54:52

标签: java pi

我想用Java计算Pi。和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);

    }
}

如果您能帮助我,谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

如安德烈亚斯(Andreas)在评论中所述,此计算导致数值溢出,因为即使对于长数据类型,其值也会变大。

由于数字溢出导致520! = 2432902008176640000,因此您现在可以使用算法的最大步数为21! = -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类。