Pi berechnung(wallissches Produkt)



  • Ich habe aus Testzwecken, ein Pi Berechnungsprogramm geschrieben, indem ich das wallissche Produkt implementiert habe.
    Ich wollte fragen gibt es genauere Methoden, die nicht viel schwerer zu verstehen sind als meine Methode?

    #include<cmath>
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	long double n = 1.0;
    
    	for(int i = 2; i <= 1000000; ++i) // je mehr durchläufe desto genauer ;)
    	{
    		if(i % 2 == 0)
    		{
    			n *= (i / ( i - 1.0 ) );
    		}
    		else
    		{
    			n *= ( ( i - 1.0 ) / i );
    		}
    	}
    	n *= 2.0;
    	cout << n;
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


  • Du meinst wahrscheinlich eher mathematische Verfahren, aber das von dir benutzte als Template-Version ist auch ganz interessant.

    #include <iostream>
    
    using namespace std;
    
    template <int N>
    class pi
    {
    public:
    
    	double operator ()(double p)
    	{
            if (N & 1)
            {
                p *= (double(N - 1) / N);
            }
            else
            {
                p *= (N / double(N - 1));
            }
    
    		return pi<N - 1>()(p);
    	}
    };
    
    template <>
    class pi <1>
    {
    public:
    
    	double operator ()(double p)
    	{
    		return p;
    	}
    };
    
    int main()
    {
    	cout << pi<1000>()(2.0);
        cin.ignore();
        cin.get();
    
        return 0;
    }
    

    Wie erwartet ist die Programmausführung extrem schnell - das Kompilieren dauert jedoch ewig. VC++08 hat bei 100000 Durchläufen gar nichts mehr zustande gebracht, ich hab das nach einiger Zeit einfach abgebrochen.



  • Habe einen neuen Algorithmus implementiert der sehr viel schneller und genauer PI berechnet.

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    template < typename T >
    T PI()
    {
    	T P;
    
    	P = ( ( 4.0 * atan( (1.0 / 5.0) ) ) - ( ( atan( (1.0 / 239.0) ) ) ) );
    
    	return P * 4.0;
    }
    
    int main()
    {
    	cout.precision(15);
    	cout << PI<long double>();
    	cin.get();
    	return 0;
    }
    


  • andrewla1990 schrieb:

    Ich habe aus Testzwecken, ein Pi Berechnungsprogramm geschrieben, indem ich das wallissche Produkt implementiert habe.
    Ich wollte fragen gibt es genauere Methoden, die nicht viel schwerer zu verstehen sind als meine Methode?

    http://n.ethz.ch/~simonbr/mathinfo_programme_pi.html



  • andrewla1990 schrieb:

    Habe einen neuen Algorithmus implementiert der sehr viel schneller und genauer PI berechnet.

    Toller Algorithmus! 4.*std::atan(1.) ist wohl noch eleganter 🙄 .



  • Du scheinst nicht verstanden zu haben, worum es hier geth... 🙄



  • o_O schrieb:

    Du scheinst nicht verstanden zu haben, worum es hier geth... 🙄

    Klar hat Walli das.



  • Weiß man's?



  • Bashar schrieb:

    Weiß man's?

    Das wird schon so sein, wenn sie das Produkt nach ihm benannt haben.



  • volkard schrieb:

    Bashar schrieb:

    Weiß man's?

    Das wird schon so sein, wenn sie das Produkt nach ihm benannt haben.

    Na dann sollte man mal evtl. die Tabelle hier aktualisieren
    http://de.wikipedia.org/wiki/Ältester_Mensch
    Gruß,
    B.B.



  • o_O schrieb:

    Du scheinst nicht verstanden zu haben, worum es hier geth... 🙄

    Dass die arctan-Summe eine bekannte Darstellung von pi ist, ist mir klar. Wo hier die sportliche Herausforderung ist, musst Du mir aber noch erklären. Gefragt waren noch viel genauere und verständlichere Methoden. Eine Darstellung von Pi durch triviale Aneinander-Reihung von Standardfunktionen zu berechnen ist ziemlich witzlos und bringt fürs Verständnis null.


Anmelden zum Antworten