Näherungsbruch für Pi
Hi Leute,
ich habe eine Frage. Momentan schreibe ich ein Programm, welches mir möglichst viele Nachkommastellen der irrationalen Zahl Pi ausgeben soll. Das Programm funktioniert so, das es einen Bruch exakt ausrechnen kann. Nun gibt es für Pi aber leider keinen Bruch (obwohl dann die Zahl auch nicht mehr so besonders wäre ;)), nur sogenannte Näherungsbrüche. Der höchsten den ich im Internet finden konnte war: 411557987 / 131002976. Sicherlich ist das Ergebnis schon sehr genau, mir aber nicht genau genug :). Jetzt also meine Frage: Gibt es noch "bessere" Näherungsbrüche für Pi und wie kann man diese "erstellen"? Schon mal Danke im Vorraus
7 Antworten
Um die Zahl Pi numerisch bis auf eine vorgegebene Genauigkeit zu beschreiben, sind Näherungsbrüche nicht besser als die stinknormalen Dezimalbrüche. Zwei einfache Beispiele:
22/7 = 3.142857.....
355/113 = 3.14159292035 .....
411557987/131002976 = 3.14159265358979325782644815641440084536705 .....
Beachte: Die Anzahl der zutreffenden Dezimalstellen ist praktisch fast exakt gleich groß wie die Anzahl der Stellen, die man zum Schreiben von Zähler und Nenner des Bruches braucht.
Deshalb sehe ich bei deinem Anliegen, "gute" Näherungsbrüche für Pi zu finden, kaum einen praktischen Vorteil.
Wenn du mit Computern arbeitest wirst irgendwann an das Limit stoßen, dass diese insbesondere bei Fließkommrechnung gerne "Rundungsfehler" machen. Daher würd ich dir empfehlen es z.B. mit den BBP-Reihen oder anderen Näherungen zu versuchen. Du findest dafür ausführliche Beschreibungen auf Wiki und im Rest des Internets.
Ich rechne in dem Programm die nächste Nachkommastelle aus und füge die dann einem String hinzu. Dann teile ich den Rest multipliziert mit 10 wieder durch die Zahl durch die ich auch vorher geteilt habe.
Hallo !
Mit wie vielen Stellen nach dem Komma bei nicht ganzzahligen Kommazahlen die zwischen 0 und 1 liegen rechnet deine Programmiersprache maximal ?
Das ist eine entscheidende Information !
LG Spielkamerad
Das stimmt nicht :-)) !
Jede Programmiersprache kann nur Fließkommazahlen einer bestimmten Länge bearbeiten !
Wenn du uns diese Information nicht gibst ist es unmöglich dir einen Bruch zu nennen den deine Programmiersprache verarbeiten kann und somit unmöglich deine Frage zu beantworten !
Falls deine Programmiersprache mit 16 signifikanten Zahlenstellen arbeitet dann probiere mal diesen Bruch -->
7853981633974483/2500000000000000
Für jede Programmiesprache gibts Bibliotheken für eine sogenannte
Ganzzahlarithmetik
Damit kann man auch rationale Brüche mit beliebiger Genauigkeit verarbeiten.
Doch das stimmt! ;) Ich muss mich ja nicht an die von der Programmiersprache (in meinem Fall C#) vorgeschlagenen Fließkommazahlen halten. Denn ich habe mir meine eigene Klasse für die Division mit BigIntegern und einem Ergebnis mit über 100.000.000.000 Nachkommastellen programmiert. Dein Bruch ist nicht schlecht, hilft mir aber auch nicht wirklich weiter. Denn das Ergebnis ist 3.1415926535897932. So weit so gut. Allerdings möchte ich noch meeehhhr Nachkommastellen ;).
Hier wird eine Formel von Shrinivasa Ramanujan vorgestellt -->
Das ist §2b von meinem LINK. Sie schafft nur 8 richtige Stellen pro Term (Iteration).
Hinweis: 4 * 99=396
§2c schafft 14 Stellen/Iteration
§2d schafft 50 Stellen/Iteration ...
Unter http://www.gerdlamprecht.de/Kreiszahl.htm
findet man über 100 Algorithmen für Pi!
Allein der Punkt "6. Bruch-Funktionen, die gegen Pi konvergieren"
zeigt mit §6a ... §6e 4 verschiedene Algorithmen, wie man Brüche bilden kann, die sich beliebig genau an Pi annähern... Per LINK kann man sich das entweder per Iterationsrechner Beispiel 81 online selbst nachrechnen lassen oder per Umkehrfunktionen Rechner die 86 Stellen berechnen lassen.
Bruch-Algorithmen sind jedoch umständlich. Die Frage lautet, was genau willst Du:
- nur Brüche? -> kann bis über 200stellige Zahlen besorgen....
- viele Stellen: 13,3 Bio. Stellen (10 TB !) sind bereits online
- selber programmieren -> welche Sprache & wieviele Stellen?
- selbst viele Stellen berechnen: mit y-cruncher (siehe LINK unten) 1 Mrd. in 4 min
- den schnellsten mathematischen Algorithmus: siehe §4e schafft 16. Ordnung!
Bei
27225206761227411560482016369101495245580376291277469609660747193789333391455909056988538515440420244451
/
8666052465496465627292667594900276640054365438839293273326351202074305984738201886052979281840113827831
stimmen schon über 100 Stellen.
Spielkram im Vergleich zu den 1 Mrd. Stellen von y-cruncher.exe ...
Wow danke, das war genau das was ich gesucht hatte. Zu deinen Fragen: -Ja, ich möchte erst einmal nur Brüche. Später möchte ich mich dann mithilfe von einer Streifenunterteilung eines Kreises Pi nähern. Echt? 200-stellige gibt es? Kannst du mir die irgendwie zukommen lassen ;). -meine Sprache ist C#. Was meinst du genau mit wie viele Stellen? Wie viele Stellen ich nach dem Komma ausrechnen kann? Seeehhr viele... ;) 100.000.000.000 sind kein Problem. -Danke, y-cruncher.exe werde ich mir mal angucken...
Die Frage "200-stellige gibt es?" beweist, dass Du §6a ... §6e nicht verstanden hast: der Algorithmus geht bis in alle Ewigkeit für Zähler und Nenner eines Bruches. Zwar sind beide noch nicht gekürzt (so wie meine beiden Angaben), aber wie der Iterationsrechner zeigt, sind schon mit i=4 Ganzzahlen mit 242 Stellen beteiligt. Ab i=5 werden nur noch die Potenzen angezeigt.
100 Mrd. Stellen von Pi in c# -> das geht nicht unter 1 Woche Rechenzeit!
Du meinst vermutlich 1 Division durch 1 ganze Zahl kleiner 100000 (und Ergebnis hat dann diese 100 Mrd. Stellen). Wie lange brauchst Du denn, um nur 2 Zahlen mit je 1 Mio. Nachkommastellen zu dividieren?
Y-cruncher (hoch optimierter c++ Code 64 Bit) kann 1 Mio. Stellen (nicht nur Wurzeln und Kehrwerte) in unter 1s .
Oder §7a: Wenn man Laufvariable k bis 190 durchrechnet und das Zwischenergebnis zu einem einzigen Bruch zusammenfasst, bekommt man 721 stellige Zahlen, die mit 235 Pi-Nachkommastellen übereinstimmen. (siehe dort)
Also verstanden: Fast JEDER dieser 100 Algorithmen könnte einen Näherungsbruch erzeugen, wenn man einfach "Mittendrin" abbricht und das Zwischenergebnis in die Form eines einzigen Bruches wandelt!
da haben ja zähler und nenner zusammen schon über 200 stellen, nur damit ich dan pi auf 100 stellen berechnen kann. nicht sehr ökonomisch. nimmt dieses ökonomiedefizit später immer weiter zu, je mehr nachkommastellen man haben will? weiss das jemand?
Mathematiker sagen nicht ökonomiedefizit sondern reden von Konvergenzgeschwindigkeit. Diese "besten Brüche" kommen aber nicht von einem Algorithmus, sondern wurden einfach der Reihe nach aufgelistet! Wenn Du Dir den von mir beschriebenen LINK unter §4e anschaust, kann man mit 4 Iterationen (Schritten) über 10000 Stellen berechnen! ABER Informatiker wissen, dass Wurzeln auch wieder aus Iterationen bestehen, und so ist §2c aktuell der schnellste Algorithmus für mehr als 1 Mrd. Nachkommastellen. Du musst also zunächst genau definieren, was Du mit welchen Mitteln eigentlich erreichen willst!
Das Zauberwort heißt Kettenbruchentwicklung. Damit kannst du den Bruch genau bis zu einer sehr großen Genauigkeit bestimmen. Für 21 Kettenbruchelemente hast du bereits den Bruch 21053343141 / 6701487259. Auf der folgenden Seite findest du die ersten paar Kettenbruchelemente. http://oeis.org/A001203
Damit wirst du eine ausreichende Genauigkeit erzielen. Das ist sogar auf Wikipedia erklärt unter "Kreiszahl". Dort unter Kettenbruchentwicklung.
Aber wie komme ich mit den Zahlen der Seite zu dem Bruch?
Na du berechnest das doch mit einem PC. Diese Zahlenreihe sind immer die Zahlen vor dem Plus unterm Bruchstrich. Auf das Plus folgt dann 1 geteilt durch die nächste Zahl Plus 1 geteilt durch nächste Zahl und so weiter. Das kannst du programmiertechnisch rekursiv oder iterativ mit einer Schleife lösen. Die Zahlenreihe kannst du in ein Array packen. Du brichst halt an einer bestimmten Stelle ab wo dann unterm Bruchstrich nur die Zahl ohne das Plus und den folgenden Bruch steht. Am Ende erhälst du sowas wie x + 1 / y. Daraus machst du z.B. (x * y) / y + 1 / y und erhälst als Ergebnis (x * y + 1) / y was dann dein Bruch ist.
unendlich viele wenn die Zeit dafür da wäre ;)