3.14159265358979323846264338327950288419716939937510582097494459
2307816406286208998628034825342117067982148086513282306647093844
6095505822317253594081284811174502841027019385211055596446229489
5493038196442881097566593344612847564823378678316527120190914564
8566923460348610454326648213393607260249141273724587006606315588
1748815209209628292540917153643678925903600113305305488204665213
8414695194151160943305727036575959195309218611738193261179310511
854807446237996274956735188575272489122793818301194913
import java.math.BigDecimal;
public class 线程Piπ {
private static final BigDecimal FOUR = BigDecimal.valueOf(4);
private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN;
private static BigDecimal result;
public static void main(String[] args) {
Runnable r= new Runnable() {
public void run() {
result = computePi(500
);
}
};
Thread t=new Thread(r);
t.start();
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(result);
}
public static BigDecimal computePi(int diigits){
int scale = diigits+5;
BigDecimal arctan1_5 = arctan(5,scale);
BigDecimal arctan1_239= arctan(239, scale);
BigDecimal pi = arctan1_5.multiply(FOUR).subtract(arctan1_239).multiply(FOUR);
return pi.setScale(diigits,BigDecimal.ROUND_HALF_UP);
}
private static BigDecimal arctan(int inversex, int scale) {
BigDecimal result , numer , term;
BigDecimal invX = BigDecimal.valueOf(inversex);
BigDecimal invY = BigDecimal.valueOf(inversex*inversex);
numer = BigDecimal.ONE.divide(invX, scale, roundingMode);
result = numer;
int i = 1;
do{
numer=numer.divide(invY, scale, roundingMode);
int denom = 2*i+1;
term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode);
if((i%2)!=0){
result = result.subtract(term);
}else {
result = result.add(term);
}
i++;
}while(term.compareTo(BigDecimal.ZERO)!=0);
return result;
}
}