有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    问题是你的电脑太慢,无法计算。这项任务的难度增长非常快(可能是n^3),因此,如果计算1 000位需要大约1秒,那么计算1 000 000位大约需要十亿秒。显然,这些任务是使用高度优化的代码和计算集群计算的。我想,如果您使用巧尽心思构建的数据类型,以十六进制执行所有中间计算,并仅在最后转换为十进制以打印结果,那么BBP公式的效果会更好。这样1/16^i步骤将变得微不足道。因此BigDecimaljava类型对于此类计算不是非常理想