我最近制作了一个与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());
}
}
答案 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中也作为常量存在)。