java使用莱布尼茨公式迭代高精度的圆周率

接着上一篇的门特卡罗方法。

又去看了一下几个圆周率的算法,挑了莱布尼茨迭代公式: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);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值