Computing π auf „unendlich“ binary Präzision in C #
Frage
Bisher sieht es aus wie Fabrice Bellard der Basis 2 Gleichung ist der Weg zu gehen
Ironischer wird dies eine BigReal Art erfordern; haben wir dies für .Net? .NET 4.0 hat BigInteger.
Wer eine Haskell-Version hat?
Lösung
Da Sie eine Haskell-Version sind gefragt, hier ist ein Papier von Jerzy Karczmarczuk: „die meisten Unzuverlässige Technik in der Welt zu berechnen π“ genannt:
Dieses Papier ist ein atypisches exercice in faul funktionale Programmierung, geschrieben für Spaß und Anleitung. Es kann gelesen werden und verstand von jedem, versteht die Programmiersprache Haskell. Wir zeigen, wie die zur Umsetzung Bailey-Borwein-Ploue Formel für π in einer Co-rekursive, inkrementaler Weg welche erzeugt die Ziffern 3, 1, 4, 1, 5, 9. . bis die Speicher Erschöpfung. Dies ist keine Art und Weise zu gehen, wenn jemand viele braucht Ziffern! Unsere Codierungsstrategie ist pervers und gefährlich, und es beweisbar bricht. Es basiert auf die arithmetics über die Domain von unendliche Folge von Ziffern richtige Fraktionen repräsentieren expandierte in einer ganzzahligen Basis. Wir zeigen, wie man manipulieren: add, vermehren sich durch eine integer, etc. Solche Sequenzen aus dem links nach rechts ad infinitum, was offensichtlich nicht in alle arbeiten Fälle wegen Unklarheiten. Etwas tief philosophische Konsequenzen in den Schlussfolgerungen diskutiert.
Es ist nicht wirklich löst das Problem in einer effizienten oder sehr praktischen Art und Weise, ist aber unterhaltsam und zeigen einige der Probleme mit fauler unendlicher Genauigkeit Arithmetik.
Dann gibt es auch dieses Papier von Jeremy Gibbons .
Andere Tipps
Mit Abstand mein Lieblings Haskell Zapfen für pi kommt von Jeremy Gibbons:
pi = g(1,0,1,1,3,3) where
g(q,r,t,k,n,l) =
if 4*q+r-t<n*t
then n : g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
Der mathematische Hintergrund, dass es rechtfertigt, dass die Umsetzung gefunden werden kann in:
Details Wikipedia eine Vielzahl von Möglichkeiten numerische Approximation von pi hier bekommen . Sie geben auch einige Beispiel-Pseudo-Code
Edit: Wenn Sie in dieser Art von mathematischen Problemen interessieren, ohne dass damit verbundene reales Problem mit zu lösen (das ist definitiv eine gute Haltung zu haben, IMHO), könnten Sie die Euler Projektseite
Es besteht eine solche Möglichkeit zu verarbeiten große rationalen Zahlen in DLR basierten dynamischen Sprachen (zB Ironpython). Oder Sie können jedes beliebige Portable C verwenden / C ++ Implementierung von großen reellen Zahlen durch P / Invoke .