Archimdes-Methode zur Berechnung von Pi



  • Hallo Ihr Lieben, vielleicht könnt Ihr mir helfen?

    Mag sein, daß einigen von Euch die Archimdes-Methode zur Berechnung von Pi etwas sagt, bei der der Näherungwert von Pi über In- und Umkreise eines n-Ecks berechnet wird.

    Könnte mir jemand den folgenden Quelltext in ein funktionierendes C++-Programm umschreiben???

    Vielen Dank schon mal im Voraus...

    Quelltext
    program archpi;
    {$n+} { laesst den Coprozessor mitrechnen }

    uses
    crt;

    var
    a, { Umfang des umschreibenden n-Ecks }
    b: double; { Umfang des einbeschriebenen n-Ecks }
    n: integer;

    begin
    a := 2sqrt(3); { Startwerte }
    b := 3;
    n := 0;
    repeat
    writeln(a:0:17, ' > pi > ', b:0:17, ' (6
    2^', n, '-Eck, delta = ', a-b:6, ')');
    a := 2*a*b/(a+b);
    b := sqrt(a*b);
    inc(n);
    until readkey = #27;
    end.

    Ergebnis
    Das soeben beschriebene Programm gibt diesen Text aus:
    3.46410161513775439 > pi > 3.00000000000000000 (6*2^0-Eck, delta = 4.6E-0001) 3.21539030917347235 > pi > 3.10582854123024887 (6*2^1-Eck, delta = 1.1E-0001) 3.15965994209750045 > pi > 3.13262861328123821 (6*2^2-Eck, delta = 2.7E-0002) 3.14608621513143483 > pi > 3.13935020304686718 (6*2^3-Eck, delta = 6.7E-0003) 3.14271459964536826 > pi > 3.14103195089050979 (6*2^4-Eck, delta = 1.7E-0003) 3.14187304997982375 > pi > 3.14145247228546198 (6*2^5-Eck, delta = 4.2E-0004) 3.14166274705684856 > pi > 3.14155760791185745 (6*2^6-Eck, delta = 1.1E-0004) 3.14161017660468955 > pi > 3.14158389214831812 (6*2^7-Eck, delta = 2.6E-0005) 3.14159703432152604 > pi > 3.14159046322805002 (6*2^8-Eck, delta = 6.6E-0006) 3.14159374877135189 > pi > 3.14159210599927130 (6*2^9-Eck, delta = 1.6E-0006) 3.14159292738509688 > pi > 3.14159251669215722 (6*2^10-Eck, delta = 4.1E-0007) 3.14159272203861351 > pi > 3.14159261936538359 (6*2^11-Eck, delta = 1.0E-0007) 3.14159267070199766 > pi > 3.14159264503369062 (6*2^12-Eck, delta = 2.6E-0008) 3.14159265786784392 > pi > 3.14159265145076727 (6*2^13-Eck, delta = 6.4E-0009) 3.14159265465930559 > pi > 3.14159265305503643 (6*2^14-Eck, delta = 1.6E-0009) 3.14159265385717079 > pi > 3.14159265345610361 (6*2^15-Eck, delta = 4.0E-0010) 3.14159265365663742 > pi > 3.14159265355637052 (6*2^16-Eck, delta = 1.0E-0010) 3.14159265360650375 > pi > 3.14159265358143713 (6*2^17-Eck, delta = 2.5E-0011) 3.14159265359397022 > pi > 3.14159265358770368 (6*2^18-Eck, delta = 6.3E-0012) 3.14159265359083673 > pi > 3.14159265358926998 (6*2^19-Eck, delta = 1.6E-0012) 3.14159265359005335 > pi > 3.14159265358966167 (6*2^20-Eck, delta = 3.9E-0013) 3.14159265358985751 > pi > 3.14159265358975937 (6*2^21-Eck, delta = 9.8E-0014) 3.14159265358980822 > pi > 3.14159265358978379 (6*2^22-Eck, delta = 2.4E-0014) 3.14159265358979578 > pi > 3.14159265358978956 (6*2^23-Eck, delta = 6.2E-0015) 3.14159265358979267 > pi > 3.14159265358979134 (6*2^24-Eck, delta = 1.3E-0015) 3.14159265358979223 > pi > 3.14159265358979178 (6*2^25-Eck, delta = 4.4E-0016) 3.14159265358979223 > pi > 3.14159265358979223 (6*2^26-Eck, delta = 0.0E+0000)



  • hallo du lieber..

    so stimmts rechnerisch noch nicht ganz, such, wo es noch hängt.

    auf die formatierungen hatte ich keine lust 😉
    und standard ist es durch den schleifenabbruch auch nicht.
    aber vielleicht hilfts

    #include <cmath>
    #include <iostream>
    #include <conio.h>//nicht standard, für getch
    using namespace std;
    
    int main()
    {
        double a;
        double b;
        int n;
        a=2*sqrt(3);
    
        do{
            cout<<a <<endl;
            a = 2*a*b/(a+b);
            b = sqrt(a*b);
            n++;
    
        }while (getch() !=27);
    }
    

Anmelden zum Antworten