我想用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);
}
}
如果您能帮助我,谢谢您的帮助
答案 0 :(得分:0)
如安德烈亚斯(Andreas)在评论中所述,此计算导致数值溢出,因为即使对于长数据类型,其值也会变大。
由于数字溢出导致5
,20! = 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
类。