java计算200w位PI和Math.PI比对
算算计算200万位PI需要多久
贝拉公式
代码
package com.jd.log.helper;
import java.math.BigDecimal;
import static java.math.RoundingMode.HALF_UP;
/**
* @author heyongxian1
* @description 贝利-波尔温-普劳夫公式 https://baike.baidu.com/item/%E8%B4%9D%E6%8B%89%E5%85%AC%E5%BC%8F/9358781?fr=aladdin
* @date 2022/11/7 6:03 PM
*/
public class TestPI {
public static final BigDecimal a = BigDecimal.valueOf(1);
public static final BigDecimal b = BigDecimal.valueOf(2);
public static final BigDecimal c = BigDecimal.valueOf(4);
public static final BigDecimal d = BigDecimal.valueOf(5);
public static final BigDecimal e = BigDecimal.valueOf(6);
public static final BigDecimal f = BigDecimal.valueOf(8);
public static final BigDecimal g = BigDecimal.valueOf(16);
public static void main(String[] args) {
//循环次数
int k = 0;
//精度
int preciseFigures = 10000 * 200;
BigDecimal pi = BigDecimal.valueOf(0);
long start = System.currentTimeMillis();
while (pi.setScale(preciseFigures, HALF_UP).doubleValue() != Math.PI) {
BigDecimal kn = f.multiply(BigDecimal.valueOf(k));
BigDecimal temp = c.divide(kn.add(a), preciseFigures + 1, HALF_UP);
temp = temp.subtract(b.divide(kn.add(c), preciseFigures + 1, HALF_UP));
temp = temp.subtract(a.divide(kn.add(d), preciseFigures + 1, HALF_UP));
temp = temp.subtract(a.divide(kn.add(e), preciseFigures + 1, HALF_UP));
pi = pi.add(temp.divide(g.pow(k), preciseFigures + 1, HALF_UP));
k++;
}
System.out.printf("花费:【%s】秒\n", (System.currentTimeMillis() - start) / 1000);
System.out.println(pi.setScale(preciseFigures, HALF_UP).doubleValue() == Math.PI);
}
}
运行结果
30秒算200w位