Näherungsbruch für Pi

7 Antworten

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.


deRRatgebeR4 
Beitragsersteller
 22.02.2015, 21:44

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.

0

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


deRRatgebeR4 
Beitragsersteller
 22.02.2015, 22:16

unendlich viele wenn die Zeit dafür da wäre ;)

1
Spielkamerad  22.02.2015, 22:28
@deRRatgebeR4

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

3
Roderic  22.02.2015, 23:26
@Spielkamerad

Für jede Programmiesprache gibts Bibliotheken für eine sogenannte

Ganzzahlarithmetik

Damit kann man auch rationale Brüche mit beliebiger Genauigkeit verarbeiten.

0
deRRatgebeR4 
Beitragsersteller
 23.02.2015, 19:40
@Spielkamerad

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 ;).

1
hypergerd  25.02.2015, 08:55
@Spielkamerad

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 ...

1

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!


hypergerd  23.02.2015, 15:20

Bei
27225206761227411560482016369101495245580376291277469609660747193789333391455909056988538515440420244451 / 8666052465496465627292667594900276640054365438839293273326351202074305984738201886052979281840113827831

stimmen schon über 100 Stellen.

Spielkram im Vergleich zu den 1 Mrd. Stellen von y-cruncher.exe ...

1
deRRatgebeR4 
Beitragsersteller
 23.02.2015, 19:48
@hypergerd

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...

0
hypergerd  23.02.2015, 21:25
@deRRatgebeR4

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 .

1
hypergerd  25.02.2015, 10:03
@hypergerd

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!

1
eddiepoole  08.09.2018, 12:12
@hypergerd

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?

0
hypergerd  09.09.2018, 20:58
@eddiepoole

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!

1

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.

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.


deRRatgebeR4 
Beitragsersteller
 22.02.2015, 21:46

Aber wie komme ich mit den Zahlen der Seite zu dem Bruch?

0
WhoGivesACrap  22.02.2015, 22:07
@deRRatgebeR4

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.

0