0

我最近制作了一个与 Math.BigDecimal 配合使用的基本 Pi 计算器。它输出到文本文件,计算速度非常快,但即使是 BigDecimal 也有其局限性。我想知道更精确的数字的基本代码是什么(并不是任何代码实际上都需要它)。这是Pi代码:

    package mainPack;
    import java.io.IOException;
    import java.math.BigDecimal;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Scanner;
    public class Main {
    public static BigDecimal piDigCalc(int i){
        double o = (double)i;
        BigDecimal ret = new BigDecimal((1/(Math.pow(16.0D, o))*((4/((8*o) + 1))-(2/((8*o) + 4))-(1/((8*o) + 5))-(1/((8*o)+6))))); //Just the code for a hexdigit of Pi.
        return ret;
    }
    public static void main(String[] args) throws IOException {
        System.out.println("Enter accuracy:");
        Scanner s = new Scanner(System.in);
        int acc = s.nextInt();
        s.close();
        BigDecimal Pi = new BigDecimal(0);
        for(int i = 0; i < acc; i++){
                Pi = Pi.add(piDigCalc(i));
        }
        Path file = Paths.get("C:\\tmp\\PI.txt");
        String pi = "" + Pi;
        Files.write(file, pi.getBytes());
            System.out.println("File has been saved at "+ file.toString());
    }
}
4

1 回答 1

0

我重写了您的piDigCalc函数以使用完全任意的精度值。您可以看到它在 ideone 上运行(1300 大约是我在 ideone 的 15 秒时间限制下可以完成的最大精度)。

它绝不是优化的,它只是将代码中的数学逐字翻译成大数。

您可能会注意到这些值实际上存在精度限制,但这部分是因为设置巨大的限制会大大增加运行时间。我设置的限制与提供的精度相适应。

万一ideone爆炸了,下面是代码piDigCalc

public static BigDecimal piDigCalc(int _i, int x){
    BigDecimal
        i = BigDecimal.valueOf(_i),
        a = SIXTEEN.pow(_i),
        b = EIGHT.multiply(i),
        c = ONE.divide(a, x, BigDecimal.ROUND_HALF_EVEN),
        d = b.add(ONE), // b + 1
        e = b.add(FOUR), // b + 4
        f = e.add(ONE), // b + 5
        g = f.add(ONE), // b + 6
        h = FOUR.divide(d, x, BigDecimal.ROUND_HALF_EVEN),
        j = TWO.divide(e, x, BigDecimal.ROUND_HALF_EVEN),
        k = ONE.divide(f, x, BigDecimal.ROUND_HALF_EVEN),
        l = ONE.divide(g, x, BigDecimal.ROUND_HALF_EVEN),
        m = h.subtract(j).subtract(k).subtract(l),
        n = c.multiply(m);

    return n;
}

常量ONE, TWO, FOUR, EIGHT, SIXTEEN被定义为类的静态并且具有精确的整数值(ONE也在 BigDecimal 中作为常量存在)。

于 2013-07-10T21:41:49.993 回答