Seite 1 von 1

Pi Berechnung

Verfasst: Freitag 27. Februar 2009, 14:12
von Crackus
Yo ich mal wieder^^
also ich will Pi (teilweise) ausrechnen und quasi ein Programm wie SuperPi nachbauen
meine "Lösung"
pi = (Ecken / 2 * Sinus(360 / Ecken))
print pi

Also code in etwa

Code: Alles auswählen

Ecken = 1
piAlt = 2
Dif = 1
Stellen = 0
while True:
      pi = (Ecken / 2 * Sinus(360 / Ecken))
      if pi - piAlt < Dif
            Dif = Dif  / 10
            Stellen = Stellen + 1
            print pi    #an Stelle X Y   und Zwar genau   "Stellen" Stellen

Also ich habe 3 Probleme einmal wie mache ich Sinus??
Wie definiere ich wie viele Stellen angezeigt werden??
Und wie kann ich definieren wo pi dann erscheint

Ich will halt nicht das dann kommt z.B."
Terminal: 2.5
Terminal: 2.8
Terminal: 3.0
Terminal: 3.01


Sondern dass er erst die nächste zahl anzeigt wenn sie auch wirklich schon feststeht also
Terminal: 3
Terminal: 3.1
Terminal: 3.14
Aber alles in eine Zeile

PS: wieder kein schulprojekt

Verfasst: Freitag 27. Februar 2009, 14:37
von derdon
Willst du die Sinus-Funktion auch selber implementieren oder reicht dir da ein einfaches cmath.sin bzw. math.sin?

Verfasst: Freitag 27. Februar 2009, 14:53
von hendrikS
Spannende Aufgabe:

Es gibt mehrere Näherungsverfahren, mit denen man Pi berechnen kann. Eines ist die Spigot Methode von Rabinowitz. Musst mal googeln. Bin gespannt was Du hier präsentierst.

Verfasst: Freitag 27. Februar 2009, 15:05
von Crackus
Willst du die Sinus-Funktion auch selber implementieren oder reicht dir da ein einfaches cmath.sin bzw. math.sin?

es reicht mir die zu implentieren kannste vieleicht mal syntax oder so angeben??(mir reicht auch ein link)^^

ich habe jetzt kein plan wie diese näherungstaktik heißt aber sie klappt^^
ich muss noch mal ein bisschen was testen

1.) das programm guckt ya ob die differenz zwischen piAlt und pi größer als 1 ist dann ob die differenz größer als 0.1 usw ist und ich will gucken ob wenn pi kp 3.14567891234 groß ist und er guckt ob die differenz weniger als 0.00000000001 ob sich dann diese vorletze 3 nochmal ändert ma schaun^^

2.) kommt noch :D

Verfasst: Freitag 27. Februar 2009, 17:05
von Blade Runner
Crackus hat geschrieben:Willst du die Sinus-Funktion auch selber implementieren oder reicht dir da ein einfaches cmath.sin bzw. math.sin?

es reicht mir die zu implentieren kannste vieleicht mal syntax oder so angeben??(mir reicht auch ein link)^^
Es reicht Dir, die zu implementieren? :wink:
Sinusfunktion des Math-Moduls: math.sin(x)

Da fällt mir noch der Montecarlo-Algorithmus ein. Das ist zwar eher nicht das, was Du willst, ist aber durchaus erwähnenswert in dem Kontext.

Verfasst: Freitag 27. Februar 2009, 18:18
von hendrikS
Blade Runner hat geschrieben:Da fällt mir noch der Montecarlo-Algorithmus ein. Das ist zwar eher nicht das, was Du willst, ist aber durchaus erwähnenswert in dem Kontext.
Konvergiert aber uebelst langsam. Damit kannst Du keinen Blumentopf gewinnen. Ich habe bei SPOJ mal eine 10000 Digit Version hochgeladen. Glaube nicht, dass Du das mit diesem Algo schaffen wuerdest.

meine fragen

Verfasst: Montag 2. März 2009, 18:24
von Crackus
also sinus weiß ich jetzt wie ich das mache...
wie schreibe ich etwas an position x y..

Verfasst: Montag 2. März 2009, 20:50
von EyDu

Verfasst: Donnerstag 16. April 2009, 15:18
von numerix
Nur für den Fall, dass der OP an seinem Vorhaben noch interessiert ist (wahrscheinlich eher nicht, sonst wäre der Thread nicht so schnell eingeschlafen - aber egal):

@Crackus: Wenn es dir darum geht, eine große Zahl von Nachkommastellen von pi zu berechnen, dann ist dein Ansatz völlig falsch. Mit Fließkommazahlen kommst du nicht weit.
Auch das grundsätzlich nette decimal-Modul von Python hilft hier nicht wirklich, weil die Berechnungen bei großer Genauigkeit (einige Tausend Stellen) quälend langsam werden.

Zunächst musst du mittels Ganzzahlarithmetik eine rationale Näherung berechnen und dann in einem letzten - teuren! - Schritt per Division deine Näherung ausrechnen.

@hendrikS: Das Verfahren von Rabinowitz ist als Spigot-Algorithmus eine interessante Sache, aber konvergiert nicht schnell genug, um damit in akzeptabler Zeit richtig viele Stellen von pi zu berechnen. Wenn man mal die SPOJ-Zeitmessung/-vorgabe als Maßstab nimmt, wird man nach meiner Einschätzung über 15.000 - 20.000 Stellen nicht hinauskommen.

@EyDu: Hast du mal eine performante Implementierung mit dem BBP-Algorithmus versucht? - Ist ein interessanter Algorithmus, braucht aber enorm viel Rechenpower und hat seine Stärken an anderer Stelle als bei der effizienten Berechnung von möglichst vielen Nachkommastellen. Jedenfalls wenn man Python einsetzt und nicht ewig warten will ...

Verfasst: Donnerstag 16. April 2009, 17:39
von hendrikS
numerix hat geschrieben:@hendrikS: Das Verfahren von Rabinowitz ist als Spigot-Algorithmus eine interessante Sache, aber konvergiert nicht schnell genug, um damit in akzeptabler Zeit richtig viele Stellen von pi zu berechnen. Wenn man mal die SPOJ-Zeitmessung/-vorgabe als Maßstab nimmt, wird man nach meiner Einschätzung über 15.000 - 20.000 Stellen nicht hinauskommen.
Deine 109000 Digits sind natuerlich beeindruckend. Mein Algorithmus ist nicht speedoptimiert. Aber ich vermute Du has recht, dass nicht mehr als 20000 Digits innerhalb von 25 SPOJ Sekunden drin sind.