質問

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

  1. 使用する Math.PI 精度を増やします(可能であれば)
  2. オイラーの式を使用してPIを生成しますが、ここでも精度を高める必要があります(私は思う)Euler's formula for PI
  3. また、急速な収束で知られているPIを生成するためのSrinivasa Ramanujanの公式もあります。この式は実装が難しいようです。私はここでも脱色の精度を高める必要があると思います。
    enter image description here

つまり、いずれにせよ、私はの精度を高める必要があります BigDecimal n桁の内容に応じて。の精度を高めるにはどうすればよいですか BigDecimal nth digitに?また、これをより良く速くする場合は、正しい方向に私を向けてください。

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

役に立ちましたか?

解決

  • Math.PI タイプです double. 。つまり、精度の約15桁の数字を意味し、それがあなたが持っているすべてのデータです。 PIの追加桁を魔法のように表示するものはありません。
  • BigDecimal 任意の精度があります。 setScale() 作成できます BigDecimal 必要に応じて精度のあるオブジェクトは、算術メソッドのほとんどが必要に応じて自動的に精度を増加させますが、もちろん精度が高いほど、すべての計算が遅くなります。
  • ラマヌジャンの式を実装する上で最も難しい部分は、皮肉なことに、一定の因子のSQRT(2)です。 BigDecimal, 、だからあなたはあなた自身を書く必要があります。

他のヒント

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

例えば

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

すべてが重要です BigDecimal計算で使用するsそれを使用します MathContext。 Heronの方法では、100桁の正確さが10回だけで、10回の反復と20個の桁が20回の桁で、それは確かに十分です。また、すべての定数を作成します BigDecimals例えば 26390 プログラムの開始時に1回だけ。

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

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

資源

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top