π后100位的计算PI

想起π就不自觉的小数点往后背,可计算器上往往也就只有十几位,那么如果想知道100位后的数字,甚至是10000位的数字要怎么办呢。
这么长的数字要用什么类型来表示呢,double型,虽说长度可达到几百位可精度却只有15位。
庆幸的是java提供了BigDecimal类来处理超大浮点数。

下面就是π算法的问题了。
参考:http://turner.faculty.swau.edu/mathematics/materialslibrary/pi/piforms.html

具体示例如下,写的不好的地方希望大家指点

import java.math.BigDecimal;

/**  
 * @Description: TODO(π小数点后100位)
 * @author zhanbian 
 * @date 2017年2月21日 下午5:47:12
 * 泰勒公式 arctan(x)  =  x − x3/3 + x5/5 − x7/7 + x9/9 − x11/11 + . . .
 * 通常用到的公式为π = 4·arctan(1),效率低
 * 这里用到的公式π  =176·arctan(1/57)+28·arctan(1/239)−48·arctan(1/682)+96·arctan(1/12943)
 * 参考:http://turner.faculty.swau.edu/mathematics/materialslibrary/pi/piforms.html
 */ 
public class PITest {

	private static int n = 100;//小数点后100位
	
	public static void main(String[] args) {
		
		BigDecimal part1 = arctan(57).multiply(new BigDecimal(176));
		BigDecimal part2 = arctan(239).multiply(new BigDecimal(28));
		BigDecimal part3 = arctan(682).multiply(new BigDecimal(-48));
		BigDecimal part4 = arctan(12943).multiply(new BigDecimal(96));

		BigDecimal part = part1.add(part2).add(part3).add(part4);
		System.out.println(part.toString());
	}
	
	public static BigDecimal arctan(int x){
		int n2 = n+2;//为了防误差
		
		BigDecimal result = BigDecimal.ZERO;
		BigDecimal xsquare = new BigDecimal(x*x);
		BigDecimal bigx = new BigDecimal(x);
		BigDecimal temp;
		BigDecimal res = BigDecimal.ONE.divide(bigx , n2, BigDecimal.ROUND_HALF_EVEN);
		
		boolean b = true;
		for(int i=1;;i+=2){
			temp = res.divide(new BigDecimal(i), n2, BigDecimal.ROUND_HALF_EVEN);
			if(temp.compareTo(BigDecimal.ZERO)==0){//根据莱布尼兹级数结果=0时返回
				break;
			}
			if(b){
				result = result.add(temp);//加
			}else{
				result = result.subtract(temp);//减
			}
			b = !b;
			res = res.divide(xsquare, n2, BigDecimal.ROUND_HALF_EVEN);
		}
		return result;
	}
}

参考博客:http://blog.sina.com.cn/s/blog_13f82cdf60102vmu5.html


下面是算出的1000位的π

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982

1480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288

1097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700

6606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365

7595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406

5664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356

0827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960

8640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425

2230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956

28638823537875937519577818577805321712268066130019278766111959092164201989


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值