使用java BigDecimal完成圆周率π的计算
2024年03月08日
package chu_nz_baby;import java.util.*;
import java.math.*;
/**
*<p>Title:π圆周率的计算</p>
*<p>Description:使用java BigDecimal完成圆周率(Chudnovsky公式)的计算。可以指定计算精度和计算参数。</p>
*<p>Copyright:Copyright(c)2004</p>
*<a href="http://www.jason314.com/palgorithm.htm">圆周率的计算方法#Chudnovsky公式</a>
*<a href="http://www.oursci.org/magazine/200301/030126.htm">圆周率π的计算历程</a>
* author chu_nz_baby hotmail.com
* version 1.0
*/
public class Pi{
private BigDecimal result;
public Pi(){
}
public void run(int n,int scale){
if(System.getProperty("debug")!=null){
System.out.println("n="+n);
}
BigDecimal upper=new BigDecimal(426880.0000*Math.sqrt(10005.0000));
upper=upper.setScale(scale,BigDecimal.ROUND_HALF_EVEN);
if(System.getProperty("debug")!=null){
System.out.println("upper="+upper);
}
BigDecimal downer=BigDecimal.valueOf(0);
for(int i=0;i<=n;i++){
BigDecimal d0=factorial(6*i).multiply(new BigDecimal(545140134*i+13591409));
BigDecimal d1=factorial(i);
BigDecimal d2=pow(d1,3);
BigDecimal d3=factorial(3*i);
BigDecimal d4=pow(-640320,3*i);
BigDecimal d5=d2.multiply(d3);
BigDecimal d6=d4.multiply(d5);
BigDecimal d=d0.divide(d6,BigDecimal.ROUND_HALF_EVEN);
downer=downer.add(d);
}
if(System.getProperty("debug")!=null){
System.out.println("downer="+downer);
}
if(System.getProperty("debug")!=null){
System.out.println("upper.scale="+upper.scale());
System.out.println("downer.scale="+downer.scale());
}
result=upper.divide(downer,BigDecimal.ROUND_HALF_EVEN);
if(System.getProperty("debug")!=null){
System.out.println("result.scale="+result.scale());
}
}
public BigDecimal getResult(){
return result;
}
public static BigDecimal pow(double val,int power){
return pow(new BigDecimal(val),power);
}
public static BigDecimal pow(BigDecimal val,int power){
BigDecimal value=BigDecimal.valueOf(1);
for(int i=1;i<=power;i++){
value=value.multiply(val);
}
return value;
}
public static BigDecimal factorial(int n){
BigDecimal value=BigDecimal.valueOf(1);
for(int i=1;i<=n;i++){
value=value.multiply(BigDecimal.valueOf(i));
}
return value;
}
public static void main(String[]args){
if(args.length<2){
System.out.println("usage:"+"java nz-baby.Pi"+"参数(0-无穷大)精度(1-4294967296)");
System.out.println("usage:"+"java nz-baby.Pi"+"n(0-)scale(1-4294967296)");
System.exit(-1);
}
int n=Integer.parseInt(args[0]);
int scale=Integer.parseInt(args[1]);
System.out.println("palgorithm n="+n+"scale="+scale);
System.out.println("start:"+new Date(System.currentTimeMillis()));
Pi p=new Pi();
p.run(n,scale);
System.out.println("end:"+new Date(System.currentTimeMillis()));
System.out.println("result="+p.getResult());
}
}