9

pi を n 桁まで生成する方法を知りたかったのです。いくつかの基本的なアイデアがあります。

  1. 使用Math.PIして精度を上げる (可能であれば)
  2. オイラーの公式を使用して pi を生成しますが、ここでも精度を上げる必要があります (と思います)。 PI のオイラーの公式
  3. Srinivasa Ramanujan の PI を生成する式もあり、これは急速な収束で知られています。この式を実装するのは難しいようです。ここでは、10進数の精度も上げる必要があると思います。
    ここに画像の説明を入力

つまり、いずれにせよBigDecimal、n 桁目に応じて の精度を上げる必要があります。BigDecimalの精度を n 桁に上げるにはどうすればよいですか? また、これを行うためのより良い、より速い方法があれば、正しい方向に向けてください。

編集: PI を生成したいだけです。計算には使いたくない。これは、BigDecimal を使用して PI を生成するという私のアイデアを実装する方法についての質問です。

4

3 に答える 3

7
  • Math.PIタイプdoubleです。これは、10 進数で約 15 桁の精度を意味し、それがすべてのデータです。魔法のように PI の数字が追加されることはありません。
  • BigDecimalは任意の精度を持ちます。setScale()を使用すると、必要なだけの精度でオブジェクトを作成できます。BigDecimalほとんどの算術メソッドは、必要に応じて自動的に精度を上げますが、もちろん、精度が高くなると、すべての計算が遅くなります。
  • ラマヌジャンの公式を実装する上で最も難しい部分は、皮肉なことに定数係数の sqrt(2)BigDecimalです。
于 2011-12-03T19:27:05.337 に答える
4

MathContextの精度を上げるために使用する必要がありますBigDecimal

例えば

MathContext mc = new MathContext(1000);
BigDecimal TWO = new BigDecimal(2, mc);

BigDecimal計算で使用するすべてのがそれを使用することが重要ですMathContext。ヘロンの方法では、10回の反復で1000桁の精度が得られ、20回の反復で100万桁の精度が得られるため、十分に優れています。また、プログラムの開始時に1回だけBigDecimalなど、すべての定数を作成します。26390

于 2011-12-03T21:34:18.930 に答える
0

このコードを使用できます

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;
}
}

資源

于 2013-07-27T14:43:37.520 に答える