PI_Algorithmus



  • Moin,
    kennt ihr einen (möglichst schnellen) Algorithmus um PI auszurechnen???

    thx
    Glamdring



  • const long double pi = 3.1415926535897932384626433832795029L; // :D
    

    Achso, du meinst auf beliebig viele Stellen? Sag das doch.



  • Joa, ich meine auf beliebig viele stellen 🤡
    Ich kenne drei Algorithmen, von denen ich zwei programmiert habe.
    Beim einen kam 2,nochwas raus, beim anderen 10001. Hier meine Implementierungen (zugegeben nicht besonders sauber 😃 ):

    long double PI(__int64 n)
    {
    	/*
             // Algorithmus von Euler
    	long double erg = 0;
    	for(__int64 i=1; i<=n; ++i)
    	{
    		erg += 1/(i*i);
    	}
    	erg *= 6;
    	erg = sqrt(erg);
    	return erg;
    	*/
             // Algorithmus von Leibniz
    	long double erg = 0;
    	__int64 i = 1;
    	while (i < n)
    	{
    		erg += 1/i;
    		i += 2;
    		erg -= 1/i;
    		i += 2;
    	}
    	return i;
    }
    

    Wenn ich eine der Funktiopnen dann mit 10000 aufrufe kommen beim ersten 2 Komma nochwas und beim zweiten 10001 raus.

    Der dritte Algorithmus den ich kenne ist der von Vieta, den konnte ich aber bisher nicht umsetzen.

    mfg
    Glamdring



  • zur leibnitz gibts da noch mehr:

    pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 -... oder
    pi^2 / 6 = 1/1^2 + 1/2^2 + 1/3^2 + 1/4^2 ... oder
    pi^2 / 8 = 1/1^2 + 1/3^2 + 1/5^2 + 1/7^2 ...

    EDIT:

    das Wallisische Produkt gibts auch:

    pi/2 = 2/1 * 2/3 * 4/3 * 4/5 * 6/5 * 6/7...



  • Glamdrink schrieb:

    Joa, ich meine auf beliebig viele stellen 🤡

    Dann sind deine Ansätze aber allesamt zum Scheitern verurteilt, long double hat eben nur begrenzte Stellen.



  • Is mir schon bewusst, aber leider komm ich ja nichtmal auf drei, also brauche ich noch keine größeren Datentypen (kennt jemand geeignete Klassen? MTL?).
    Außerdem habe ich den zweiten Algorithmus falsch geschrieben (sonst käm ja ungefähr 3 raus).

    mfg
    Glamdring


Anmelden zum Antworten