首先给出公式如下:
π=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)+"毫秒" );
}
}