Java-BBP公式中PI的bigdecimal百万元
我试图实现BBP公式来计算π的百万个元素。我在计算和显示结果方面有问题。当我在循环中为1 000 000
设置i
并且为超过1000
设置MathContext()
时,程序没有结束。我把我的代码贴在下面,请帮忙
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class Rsi {
public static void main(String[] args) {
BigDecimal iterationResult, temp, temp2, temp3, temp4, temp5,
one, two, four, five, six, eight, sixteen, ii, result, pd, tc;
result = new BigDecimal(0);
result.setScale(1000000, RoundingMode.HALF_DOWN);
for (int i = 0; i < 1000000; i++) {
pd = new BigDecimal(0);
tc = new BigDecimal(0);
temp = new BigDecimal(0);
temp2 = new BigDecimal(0);
temp3 = new BigDecimal(0);
temp4 = new BigDecimal(0);
temp5 = new BigDecimal(0);
two = new BigDecimal(2);
four = new BigDecimal(4);
five = new BigDecimal(5);
six = new BigDecimal(6);
eight = new BigDecimal(8);
sixteen = new BigDecimal(16);
one = new BigDecimal(1);
iterationResult = new BigDecimal(0);
ii = new BigDecimal(i);
// calculate 1/16^i
temp = one.divide((sixteen.pow(i)), new MathContext(10,
RoundingMode.HALF_DOWN));
// calculate 4/(8*i+1) first word
temp2 = four.divide((eight.multiply(ii)).add(one), new MathContext(
1000, RoundingMode.HALF_DOWN));
// calculate 2/(8*i+4) second word
temp3 = two.divide((eight.multiply(ii)).add(four), new MathContext(
1000, RoundingMode.HALF_DOWN));
// calculate 1/(8*i+5) third word
temp4 = one.divide(((eight.multiply(ii)).add(five)),
new MathContext(1000, RoundingMode.HALF_DOWN));
// calculate 1/(8*i+6) fourth word
temp5 = one.divide(((eight.multiply(ii)).add(six)),
new MathContext(1000, RoundingMode.HALF_DOWN));
// calculate ( 4/(8*i+1) )-( 2/(8*i+4) ) first - second
pd = temp2.subtract(temp3);
// calculate -third-fourth word
tc = (temp4.negate()).subtract(temp5);
// calculate 1/16^k * ((first - second) + (-third - fourth))
iterationResult = temp.multiply((pd.add(tc)));
result = result.add(iterationResult);
}
System.out.println("Result is " + result);
}
}
为什么当我将loop设置为100万并且MathContext
设置为100万时,我不能显示100万个数字
# 1 楼答案
问题是你的电脑太慢,无法计算。这项任务的难度增长非常快(可能是
n^3
),因此,如果计算1 000
位需要大约1秒,那么计算1 000 000
位大约需要十亿秒。显然,这些任务是使用高度优化的代码和计算集群计算的。我想,如果您使用巧尽心思构建的数据类型,以十六进制执行所有中间计算,并仅在最后转换为十进制以打印结果,那么BBP公式的效果会更好。这样1/16^i
步骤将变得微不足道。因此BigDecimal
java类型对于此类计算不是非常理想