比BigDecimal更大的数据小数

时间:2013-07-10 20:25:41

标签: bigdecimal pi

我最近制作了一个与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());
    }
}

1 个答案:

答案 0 :(得分:0)

我重写了你的piDigCalc函数以使用完全任意的精度值。你可以看到它running on ideone(1300是我在ideone的15秒时限内完成的最大精度)。

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

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

如果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中也作为常量存在)。