Bailey-Borwein-Plouffe-Iterationen
Wir haben ein paar Pi-Herausforderungen bei PPCG gesehen, aber keine, die speziell den Algorithmus vorschreiben, den Sie verwenden sollten. Ich würde gerne Implementierungen des Bailey-Borwein-Plouffe-Algorithmus in jeder Sprache bis hin zur Iteration sehen n
. Die Formel lautet wie folgt:
Ihr Algorithmus sollte jede Iteration bis zu n ausgeben und dabei sowohl Zwischensummen als auch das Endergebnis anzeigen, um ein "Dreieck" zu bilden. Sie können auch die reduzierte Polynomform des auf der Wikipedia-Seite gezeigten Algorithmus verwenden. Ein Beispiellauf für n=50
ist unten gezeigt:
3
3.1
3.14
3.141
3.1415
3.14159
3.141592
3.1415926
3.14159265
3.141592653
3.1415926535
3.14159265358
3.141592653589
3.1415926535897
3.14159265358979
3.141592653589793
3.1415926535897932
3.14159265358979323
3.141592653589793238
3.1415926535897932384
3.14159265358979323846
3.141592653589793238462
3.1415926535897932384626
3.14159265358979323846264
3.141592653589793238462643
3.1415926535897932384626433
3.14159265358979323846264338
3.141592653589793238462643383
3.1415926535897932384626433832
3.14159265358979323846264338327
3.141592653589793238462643383279
3.1415926535897932384626433832795
3.14159265358979323846264338327950
3.141592653589793238462643383279502
3.1415926535897932384626433832795028
3.14159265358979323846264338327950288
3.141592653589793238462643383279502884
3.1415926535897932384626433832795028841
3.14159265358979323846264338327950288419
3.141592653589793238462643383279502884197
3.1415926535897932384626433832795028841971
3.14159265358979323846264338327950288419716
3.141592653589793238462643383279502884197169
3.1415926535897932384626433832795028841971693
3.14159265358979323846264338327950288419716939
3.141592653589793238462643383279502884197169399
3.1415926535897932384626433832795028841971693993
3.14159265358979323846264338327950288419716939937
3.141592653589793238462643383279502884197169399375
3.1415926535897932384626433832795028841971693993751
3.14159265358979323846264338327950288419716939937510
Die Genauigkeit jeder Iteration sollte n
derjenigen entsprechen, die an den Algorithmus übergeben wird, d. H., Jede Iteration sollte pi bis zu dem n
für alle übergebenen Wert berechnen k
.
Regeln:
- Eingebaute Funktionen sind nicht zulässig
pi
. Sie müssen auch nicht die Formel verwenden. - Sie müssen
n
bis zu einem Maximum unterstützen, das Ihre Sprache in Bezug auf die Berechnung von zulässt16^n
. Wenn die Eingabe während der Berechnung nach derx<n
Ausführung einen arithmetischen Überlauf verursacht, weil Ihre Sprache nur Dezimalstellen bis zu unterstützt2^32-1
, ist dies in Ordnung. Alle anderen Annahmenn
sind nicht in Ordnung. - Sie MÜSSEN erklären, wie Sie die Ausgabe erhalten haben, wenn dies nicht offensichtlich ist. Wenn Sie beispielsweise in einer Golf-Sprache posten, ist eine Aufschlüsselung zu 100% erforderlich. Damit stellen Sie sicher, dass Sie den angegebenen Algorithmus verwenden.
- Standard-Schlupflöcher sind nicht zulässig.
- Dies ist Code-Golf, hier gewinnt die niedrigste Byteanzahl.
Referenzcode (Code zum Generieren des Beispiels):
public static void main(String[] args) {
(0..50).each {
n->
def x=(0..n).collect {
j->
def k=new BigDecimal(j)
def s={it.setScale(n)}
def a=s(1.0g).divide(s(16.0g)**s(k))
def b=s(4.0g)/(s(8.0g)*s(k)+s(1.0g))
def c=s(2.0g)/(s(8.0g)*s(k)+s(4.0g))
def d=s(1.0g)/(s(8.0g)*s(k)+s(5.0g))
def e=s(1.0g)/(s(8.0g)*s(k)+s(6.0g))
def f=a*(b-c-d-e)
}.sum()
println(n + "\t" + x.setScale(n, BigDecimal.ROUND_DOWN))
}
}
Diese Implementierung beschränkt sich auf n=255
, Sie können auch auf weniger oder mehr begrenzen.
Diese Implementierung wurde in Groovy durchgeführt.
Calculate foo via x method
Herausforderungen darstellt.Antworten:
05AB1E ,
635250 BytesSpezialisierungsformel
Probieren Sie es online!
BBP-Formel
Probieren Sie es online!
quelle
Python 2,
109108 BytesTeste es auf Ideone .
quelle
Python 2, 174 Bytes
Mann, dies ist eine Zeit, in der ich mir wünschte, Python hätte eine einfachere Möglichkeit, die unendliche Genauigkeit für Dezimalstellen beizubehalten. Möglicherweise ist die Implementierung eines eigenen Typs für die unendliche Genauigkeit für diese Herausforderung kürzer, aber ich kann mir nicht vorstellen, wie. Die Formel ist wörtlich geschrieben.
Beispielausgabe für
n=100
(mit einigen hinzugefügten Zeilennummern):Dies scheint bei größeren Zahlen zu funktionieren, dauert nur
n=1000
ein paar Sekunden undn=10000
scheint mir noch keine Fehler zu bereiten!quelle
Haskell,
101100 BytesDanke an @nimi für ein Byte.
Einfache Implementierung. Berechnet
n
bis zu 15 Stellen (doppelte Standardgenauigkeit).quelle
l<-[8*fromIntegral k]
anstelle vonlet ...
speichert ein Byte.J,
736462 BytesDies gibt jede Annäherung an n Ziffern als formatierte Zeichenfolge aus. Hierbei wird die polynomielle Vereinfachung der Formel verwendet, und es werden die ersten n Stellen ermittelt, indem die Summe mit einer Potenz von 10 multipliziert wird, der Wert aufgeschlüsselt wird und durch dieselbe Potenz von 10 dividiert wird.
Die Eingabe wird als erweiterte Ganzzahl interpretiert, was bedeutet, dass bei der Division Rationalzahlen verwendet werden, um die Ergebnisse exakt zu halten.
Verwendung
Dies ist die Ausgabe für n = 100 und zeigt die kumulierten Summen für k in [0, 100].
Erläuterung
Machen Sie zuerst den Bereich [0, n ] für n = 5
Jeweils mit 8 multiplizieren
Bilden Sie die Additionstabelle zwischen
[1, 4, 5, 6]
und den Produkten mit 8Teilen Sie jede Zeile durch
[4, 2, -1, 1]
Reduzieren Sie dann die Spalten von unten nach oben durch Subtraktion
Teilen Sie alle 16 k für k in [0, n ] durch jedes Ergebnis
Finden Sie die kumulierten Summen
Berechne 10 k für k in [0, n ] und multipliziere es mit jedem
Dann Boden jedes der Produkte
Teilen Sie es durch die gleiche Potenz von 10, um die Ergebnisse zu erhalten
quelle
PARI / GP, 86 Bytes
Oder ohne Komma in 69 Bytes :
Anstatt bei jeder Iteration durch 16 k zu dividieren , wird der vorherige Wert von p stattdessen mit 16 multipliziert . Der Boden von p ÷ (8/5) k ist dann der Wert von π , der auf die richtige Anzahl von Stellen abgeschnitten ist.
Beispielnutzung
quelle
C GCC, 118 Bytes
Golf gespielt:
Ungolfed:
Um n zu ändern, ändern Sie einfach while (k <15) zu while (k <n).
Ausgabe:
Die maximale Genauigkeit beträgt 15 Dezimalstellen, ich könnte mit gmp auf jeden Wert steigen, aber vielleicht am nächsten Tag: P
mit hübschem Druck 143 Bytes
Golf gespielt:
Ungolfed:
Ausgabe:
quelle
IBM / Lotus Notes-Formel, 125 Byte
Formel in einem berechneten Feld mit einem anderen Feld namens "a" zur Eingabe.
Grundsätzlich ein Port des Algorithmus aus der Python-Antwort von @shebang. Berechnet bis zu 15 Stellen, nach denen es aufgrund einer Einschränkung der Sprache abgeschnitten wird (siehe Ausgabe). Musste 12 Bytes mit der @ If-Anweisung am Ende verschwenden, nur um das loszuwerden. nach der 3 am start: - /
Ungolfed
quelle
C #, 183 Bytes
Golf gespielt:
Ungolfed:
quelle
3.14159265358979
für jedenn >= 14
aufgrund doppelter Genauigkeit?APL (NARS), 206 Zeichen, 412 Byte
Hier finden Sie alle Approssimation in big rational, als verwenden Sie eine Funktion, die big rational in numerische Zeichenfolge umwandelt ... test:
quelle