Frage

Ich wollte wissen, wie ich PI in die n -te Ziffer erzeugen kann. Ich habe ein paar grundlegende Ideen.

  1. Verwenden Math.PI und erhöhen Sie die Präzision (wenn das möglich ist)
  2. Verwenden Sie Eulers Formel, um PI zu erzeugen, aber auch hier müsste ich die Präzision erhöhen (glaube ich)Euler's formula for PI
  3. Es gibt auch Srinivasa Ramanujans Formel zur Erzeugung von PI, die für seine schnelle Konvergenz bekannt ist. Diese Formel scheint schwer zu implementieren. Ich glaube, ich müsste hier auch die Deicmal -Präzision erhöhen.
    enter image description here

Kurz gesagt, ich müsste die Präzision von erhöhen BigDecimal Je nachdem, was die nte Ziffer ist. Wie würde ich die Präzision von erhöhen BigDecimal zur n -ten Ziffer? Wenn es ein besseres und schnelleres dies gibt, können Sie mich bitte in die richtige Richtung weisen.

EDIT: Ich möchte nur PI generieren. Ich möchte nicht für Berechnungen verwenden. Und dies ist eine Frage, wie ich BigDecimal verwenden kann, um meine Ideen zur Generierung von PI zu implementieren.

War es hilfreich?

Lösung

  • Math.PI ist vom Typ double. Das bedeutet ungefähr 15 Dezimalstellen der Präzision, und das sind alle Daten, die Sie haben. Nichts wird auf magische Weise zusätzliche Ziffern von PI erscheinen lassen.
  • BigDecimal hat willkürliche Präzision. setScale() ermöglicht es Ihnen zu erstellen BigDecimal Objekte mit so viel Genauigkeit, wie Sie möchten, und die meisten arithmetischen Methoden erhöhen automatisch die Genauigkeit nach Bedarf, aber je präziser, desto langsamer werden alle Berechnungen.
  • Der schwierigste Teil der Implementierung der Formel von Ramanujan wird ironischerweise der SQRT (2) im konstanten Faktor sein BigDecimal, Sie müssen also Ihre eigenen schreiben.

Andere Tipps

Sie müssen verwenden MathContext die Präzision der Präzision des BigDecimal

z.B

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

Es ist wichtig, dass alle alle BigDecimals, die Sie in Ihren Berechnungen verwenden, verwenden das MathContext. Die Methode von Heron sollte Ihnen 1000 Ziffern mit nur 10 Iterationen und einer Million Ziffern mit 20 Iterationen geben, sodass es sicherlich gut genug ist. Erstellen Sie auch die gesamte Konstante BigDecimals wie z 26390 Nur einmal zu Beginn Ihres Programms.

Sie können diesen Code verwenden

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

Ressource

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top