利用Java的BigDecimal与马青公式精确计算π后10000位,

首先给出公式如下:
π=16arctan1/5−4arctan1/239;
即是
π=16×(1/(1×5)−1/(3×5的3次方)+1/(5×5的5次方)…)−4×(1/(1×239)−1/(3×239的3次方)+…);

级数中的分数,分母增长很快,但我们可以对一个分式,不断除以同一个低精度数(25、239的平方),就能得到所有分数的值。
此公式适用计算百万以下级别精度的圆周率,是广泛使用的计算公式。

本人大致思路如下:
大致思路:利用马青公式与Java的BigDecimal对结果计算,
理论上可以精确到π的十万位以后,

程序优化思路:
1,可以使用文本文件存储输出结果
2,马青公式分为两部分,可以使用多线程同时运算,提高时间效率。

本人源代码如下:

package com.pi;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 
 * @author joker
 *
 *@大致思路:利用马青公式与Java的BigDecimal对结果计算,
 *理论上可以精确到π的十万位以后,
 *
 *程序优化思路:
 *1,可以使用文本文件存储输出结果
 *
 *2,马青公式分为两部分,可以使用多线程同时运算,提高时间效率。
 */
public class GetPai {

	public static void main(String[] args) {
		
		// 马青公式:π=16(arctan1/5−4arctan1/239 )
		//初始公式变量相关
		BigDecimal fz = BigDecimal.ONE;
		BigDecimal fz1 = new BigDecimal("5");
		BigDecimal fz2 = new BigDecimal("239");
		
		BigDecimal fm1 = new BigDecimal("25");
		BigDecimal fm2 = new BigDecimal("57121");
		BigDecimal a = new BigDecimal("4");
		BigDecimal b = new BigDecimal("1");
		BigDecimal c = new BigDecimal("2");
		//公式符号改变标志
		int flag = 1;
		//结果存储
		//分结果
		BigDecimal result1;
		BigDecimal r1;
		BigDecimal r2;
		//总结果
		BigDecimal result = new BigDecimal("0");
		//精确迭代次数10000次
		int n=10000;
		//start
		int i = 1;
		long time1=new Date().getTime();
		while (i < n) {
			i++;
			//分式子结果,计算1
			r1=fz.divide(fz1.multiply(b),n,BigDecimal.ROUND_DOWN);
			r2=fz.divide(fz2.multiply(b),n,BigDecimal.ROUND_DOWN);
			//分式子结果,计算1
			if (flag == 1) {
				result1=a.multiply(r1).subtract(r2);
				//标志改变
				flag = -1;
			} else {
				result1=r2.subtract(a.multiply(r1));
				flag = 1;
			}
			
			//总计算
			result = result.add(result1);
			//变量迭达变换
			b=b.add(c);
			fz1 = fz1.multiply(fm1);
			fz2 = fz2.multiply(fm2);

		}
		//end
		long time2=new Date().getTime();
		//输出pi1000与计算时间
		System.out.println("pi计算的结果:\n" + result.multiply(a).toString().substring(0, 1000));
		System.out.println("pi计算的时间:\n" +(time2-time1)+"毫秒" );
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值