Pi Berechnung

Du hast eine Idee für ein Projekt?
Antworten
Crackus
User
Beiträge: 24
Registriert: Donnerstag 19. Februar 2009, 09:59

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
Zuletzt geändert von Crackus am Freitag 27. Februar 2009, 15:11, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Willst du die Sinus-Funktion auch selber implementieren oder reicht dir da ein einfaches cmath.sin bzw. math.sin?
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Crackus
User
Beiträge: 24
Registriert: Donnerstag 19. Februar 2009, 09:59

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
Benutzeravatar
Blade Runner
User
Beiträge: 21
Registriert: Montag 23. Februar 2009, 11:41

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.
[quote="Roy Batty"]All those moments will be lost in time, like tears in rain ... time to die.[/quote]
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Crackus
User
Beiträge: 24
Registriert: Donnerstag 19. Februar 2009, 09:59

also sinus weiß ich jetzt wie ich das mache...
wie schreibe ich etwas an position x y..
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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