我想知道如何生成π到第n位数字。我有几个基本想法。
Math.PI
并提高精度(如果可能的话)
总之,不管是哪种情况,我都需要提高BigDecimal
的精度,这取决于第n位数字是什么。如何将BigDecimal
的精度提高到第9位呢?此外,如果有一个更好和更快的这样做,请您指出我的正确方向。
编辑:我只想生成PI。我不想用它来计算。这是一个关于如何使用BigDecimal来实现我的PI生成思想的问题。
发布于 2011-12-03 19:27:05
Math.PI
是double
型的。这意味着大约15位小数位的精度,这就是你拥有的所有数据;没有什么能神奇地使PI的额外数字出现。BigDecimal
具有任意精度。setScale()
允许您以所需的精度创建BigDecimal
对象,而且大多数算术方法都会根据需要自动提高精度,但当然,精度越高,所有计算都会越慢。BigDecimal
没有内置sqrt(),因此您必须编写自己的sqrt(2)。发布于 2011-12-03 21:34:18
您需要使用MathContext
来提高BigDecimal
的精度
例如:
MathContext mc = new MathContext(1000);
BigDecimal TWO = new BigDecimal(2, mc);
重要的是,您在计算中使用的所有BigDecimal
都使用该MathContext
。Heron的方法应该给你1000位的精度,只有10次迭代,一百万位数有20次迭代,所以它当然足够好了。另外,创建所有常量的BigDecimal
,例如,在程序开始时只创建一次26390
。
发布于 2013-07-27 14:43:37
您可以使用以下代码
import java.math.BigDecimal;
import java.math.RoundingMode;
public final class Pi {
private static final BigDecimal TWO = new BigDecimal("2");
private static final BigDecimal FOUR = new BigDecimal("4");
private static final BigDecimal FIVE = new BigDecimal("5");
private static final BigDecimal TWO_THIRTY_NINE = new BigDecimal("239");
private Pi() {}
public static BigDecimal pi(int numDigits) {
int calcDigits = numDigits + 10;
return FOUR.multiply((FOUR.multiply(arccot(FIVE, calcDigits)))
.subtract(arccot(TWO_THIRTY_NINE, calcDigits)))
.setScale(numDigits, RoundingMode.DOWN);
}
private static BigDecimal arccot(BigDecimal x, int numDigits) {
BigDecimal unity = BigDecimal.ONE.setScale(numDigits,
RoundingMode.DOWN);
BigDecimal sum = unity.divide(x, RoundingMode.DOWN);
BigDecimal xpower = new BigDecimal(sum.toString());
BigDecimal term = null;
boolean add = false;
for (BigDecimal n = new BigDecimal("3"); term == null ||
term.compareTo(BigDecimal.ZERO) != 0; n = n.add(TWO)) {
xpower = xpower.divide(x.pow(2), RoundingMode.DOWN);
term = xpower.divide(n, RoundingMode.DOWN);
sum = add ? sum.add(term) : sum.subtract(term);
add = ! add;
}
return sum;
}
}
https://stackoverflow.com/questions/8370290
复制相似问题