| Registrieren Sie sich (oder melden Sie sich an) um den vollen Funktionsumfang von Das-Computer-Board.de zu nutzen! |
|
einzelne Stelle von Pi berechnen
|
|
09.06.2008, 17:05
Beitrag: #1
|
||||
|
||||
|
einzelne Stelle von Pi berechnen
Hallo leute...
Sitz hier grad an etwas für die schule und hab so nen paar probleme. Wie die überschrift schon sagt geht es darum einzelne Stellen von Pi zu berechen. Eigentliche Aufgabe ist zwar Pi auf 100 Nachkommastellen zu berechen, aber da Delphi keinen Datentyp hat der 100 nachkommastellen bietet, und ich es gleich auch für theoretisch 1000 und mehr machen will, bräuchte ich mal ne berechnungsmethode für nur eine einzelne stelle. Die würde ich dann nacheinander für alle gewünschten stellen ausführen... Bei Wikipedia hab ich diese Formel gefunden: ![]() Man kann damit irgenwie einzelne Stellen von Pi berechnen aber ich hab keine idee wie... Hoffe ihr könnt mir weiterhelfen... MaR-V-iN PS: auch ein verständlicher c++/basic code wäre OK. Könnte den selber umsetzen ![]() Mein PC - GetItDown - WiWii - Mehr Besucher? |
||||
| Werbung |
|
09.06.2008, 18:40
Beitrag: #2
|
||||
|
||||
|
RE: einzelne Stelle von Pi berechnen
http://www.experimentalmath.info/bbp-codes/bbp-alg.pdf
seite 2 ab ca 1/3 der seite ... für die unendliche summe der Sj nehmen die im beispiel code die ersten 100 summanden ... der fehler der dadurch entsteht macht sich erst einige stellen später bemerkbar, so dass man bei "normalen" 64bit floating point operationen im rechner in der regel 9 korrekte stellen bekommt ... wenn du dich darauf verlässt dass 6 stellen korrekt sind, solltest du auf der sicheren seite sein... beispiel implementationen finden sich hier: http://www.experimentalmath.info/bbp-codes/ Gräten auf dem Sofakissen wird man wohl entfernen müssen. |
||||
|
10.06.2008, 13:07
Beitrag: #3
|
||||
|
||||
|
RE: einzelne Stelle von Pi berechnen
Das was ich verstanden hab sah sehr vielversprechend aus...
aber ich hab immernoch nich so recht verstanden wie ich das jetzt anwende... Ach und wenn es mir jetz jemand erklärt, bitte in "deutsch", d.h. so das ich es verstehe (bin in der 9. Klasse)... MaR-V-iN ![]() Mein PC - GetItDown - WiWii - Mehr Besucher? |
||||
|
10.06.2008, 17:22
Beitrag: #4
|
||||
|
||||
|
RE: einzelne Stelle von Pi berechnen
ok, schau dir das PDF nochmal an. dort gibt es 2 für deine anwendung relevante gleichungen auf seite 2 ... die gleichungen (4) und (6)
gleichung 4 sagt dir, wie du dein ergebnis aus den teilergebnissen zusammensetzt: du berechnest die {16^d Sj} und setzt sie in diese gleichung ein... d ist die stelle ab der du berechnen willst, j ist ein index ... du brauchst die werte für die indizies 1, 4, 5 und 6 gleichung 6 sagt dir, wie die {16^d Sj} berechnet werden (das forum hier schein kein latex zu können, daher musst du für die schöne formel ins pdf schauen) gemeint ist die letzte zeile auf seite 2: die formel besteht im wesentlichen aus 2 summen (das große griechische Sigma) unterhalb eines Summenzeichens steht der zugehörige index ... in diesem fall k. die summe bezieht sich auf den bruch hinter dem summenzeichen. das summen zeichen darfst du dir analog zur for schleife in C vorstellen: die schleife läuft von k=0 bis k=d, und wertet immer wieder den bruch aus, nur halt mit dem jeweils aktuellen k ... d ist wieder die stelle die du ausrechnen willst, j ist wieder der jeweilige wert aus {1,4,5,6} danach folgt eine zweite summe, die eigentlich unendlich viele summanden hat, sie funktioniert genauso wie die erste ... für die praktische anwendung denk dir anstelle von "unendlich"(die liegende 8 über dem Sigma) einfach "d+100" ... da du diese summe nicht vollständig berechnest, entsteht ein fehler, der dir bei "d+100" das ergebnis ab ca. der 9 stelle verfälscht (einen derartigen nachteil haben alle numerischen verfahren) ... du kannst aber normalerweise davon ausgehen, dass alles bis zur 6. stelle richtig ist, und dann das ganze für die d+6. stelle wieder neu ansetzen ... das größte problem beim rechnen wird vermutlich sein dass du große exponenten bekommst ... du möchtest kein 16 hoch 10000 berechnen wenn du danach sowieso wieder mod 8k+j reduzierst ... das würde a) viel zu lange dauern, und b) dein ergebnis verfälschen, da derartig große zahlen nicht mehr vernünftig im rechner dargestellt werden können (die zahl hat 40000 bit) ... als fließkomma zahl kann man die zwar darstellen, aber nicht exakt, was wiederum einen fehler bedeutet, der nach der modulo reduktion nicht mehr unbedeutend ist ... die lösung dieses problems heißt square-and-multiply algorithmus ... der ist bei wikipedia zu finden und beruht darauf, dass z.b. 16^100 == (((((((16^2)*16)^2)^2)^2)*16)^2)^2 im dummen fall multipliziert man 100 mal 16 mit sich selbst ... im schlauen fall hat man 8 multiplikationen... das ist definitiv schneller und hat den vorteil, dass man zwischendurch an jeder beliebigen stelle immer wieder die modulo reduktion durchführen kann, ohne dass sich am endergebnis etwas verändern würde ... die zahlen bleiben "relativ" klein, und der darstellungsfehler einer fließkommazahl wird minimiert ... so weit so toll? Gräten auf dem Sofakissen wird man wohl entfernen müssen. |
||||
|
13.06.2008, 18:07
(Dieser Beitrag wurde zuletzt bearbeitet: 13.06.2008 18:07 von MaR-V-iN.)
Beitrag: #5
|
||||
|
||||
|
RE: einzelne Stelle von Pi berechnen
Zuerst einmal Danke... das war sehr informativ...
Ich hab versucht das so umzusetzen, allerdings hab ich das Gefühl das noch was nicht will... für die Berechnung von {16^d Sj}: Code: function formel6(j,d:Integer):Extended;Code: y := 4 * formel6(1, 1) - 2 * formel6(4, 1) - formel6(5, 1) - formel6(6, 1);das ergebniss ist dann aber: Code: 5,41306863451018e-127Also was ist falsch?? MaR-V-iN ![]() Mein PC - GetItDown - WiWii - Mehr Besucher? |
||||
|
13.06.2008, 19:45
(Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2008 05:43 von GrafZahl.)
Beitrag: #6
|
||||
|
||||
|
RE: einzelne Stelle von Pi berechnen
ahhh ... mein fehler
ich habe vergessen zu erwähnen was die großen geschweiften klammern bedeuten: es zählt nur der bruchtanteil soll heißen: {5,8435346543} = 0,8435346543 oder auch: Ergebnis = Ausdruck - (int) Ausdruck ... edit: ich war mal so frei das in c zu implementieren und zu kommentieren... Code: #include <stdio.h>für d > 1400 gibts irgendwo nen überlauf, der zum crash führt ... Gräten auf dem Sofakissen wird man wohl entfernen müssen. |
||||
|
|
|



![[Bild: f9733b62958be8751fbab97431c27af5.png]](http://upload.wikimedia.org/math/f/9/7/f9733b62958be8751fbab97431c27af5.png)
![[Bild: marvin.png]](http://das-computer-board.de/userbars/marvin.png)
Für diesen Artikel bedanken sich:

