接着上一篇的门特卡罗方法。
又去看了一下几个圆周率的算法,挑了莱布尼茨迭代公式:pi/4=1-1/3+1/5-1/7+1/9……
求出来的结果是(100位小数):
3.1415926540554545259872230756648344179116320363727376140128713099853213974820294342616300093091457012
比起之前的门特卡罗方法,这个公式可以更快速的迭代到比较高的精度(6位小数、7位小数)
受制于循环函数的int限制,在第21亿4千万次迭代后,误差约为4.67289E-10
下面是具体的代码:
package HowBigIsPi;
import java.math.BigDecimal;
public class Leibniz {
public static BigDecimal mpi = new BigDecimal("0");
public static BigDecimal quartermpi = new BigDecimal("0");
public static BigDecimal general = new BigDecimal("0");
public static BigDecimal mone = new BigDecimal("-1");
public static BigDecimal one = new BigDecimal("1");
public static BigDecimal two = new BigDecimal("2");
public static BigDecimal four = new BigDecimal("4");
public static BigDecimal pi = new BigDecimal("-3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679");
public static void main(String[] args) {
System.out.println(mathPart(Integer.MAX_VALUE));
}
private static BigDecimal mathPart(int num) {
for (int i = 0; i < num; i++) {
general = mone.pow(i%2).divide(two.multiply(BigDecimal.valueOf(i)).add(one), 100, BigDecimal.ROUND_UP);
quartermpi = quartermpi.add(general);
if(i%10000000 == 0) {
System.out.println("当前次数:" + i + "; deviation ≈ " + quartermpi.multiply(four).add(pi));
}
}
return quartermpi.multiply(four);
}
}