Berechnung der Zahl PI mit C

  • geschlossen
  • C

  • Freelancers
  • 5414 Aufrufe 8 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Berechnung der Zahl PI mit C

    Bin gerade dabei C zu lernen und als Aufgabe ist es die Zahl PI möglichst genau zu berechnen mit wenig Code.
    So habe schon gegoogle und habe diverse Lösung gefunden, leider aber ziemlich kommentarlos. (d.h. verstehe den Code überhaupt nicht)

    Z.B soll dieser Code PI bis zu 800 Stellen genau berechnen
    /********************************************
    int a=10000,b,c=2800,d,e,f[2801],g;
    main()
    {for( ;b-c; )
    f[b++]=a/5;
    for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
    for(b=c;d+=f*a,f[b]=d%--g,d/=g--,--b;d*=b);
    }
    /*******************************************

    Bei mir unter Visual C++ macht er Fehler, bei mein Kumpel mit Eclipse funktioniert er. Kann jemand mir erklären was der Code überhaupt tut?

    Bin offen gegenüber alternativ Vorschläge zur Berechnung von Pi.
  • Falsche Herangehensweise.
    Du bist dabei C zu lernen.
    Also mach das auch. :)
    Google lieber nach mathematische Algorithmen zur Berechnung von PI.
    Und wenn du da was gefunden hast, programmierst du das in C.
    Und dann denkst du drüber nach wie man das vielleicht kürzer machen könnte
    und wo man was "verbessern" könnte.
    Denn dieser Code so wie er da ist, ist reiner Müll.
    Kategorie: Funstyle.
    Motto: Guckt mal was ich kann.
    Nutzen: 0
    :)

    P.S.:
    Achja ganz vergessen. Der Code berechnet PI, falls dir das was hilft. LoL
  • stelzi schrieb:

    Falsche Herangehensweise.
    Du bist dabei C zu lernen.
    Also mach das auch. :)
    Google lieber nach mathematische Algorithmen zur Berechnung von PI.
    Und wenn du da was gefunden hast, programmierst du das in C.
    Und dann denkst du drüber nach wie man das vielleicht kürzer machen könnte
    und wo man was "verbessern" könnte.
    Denn dieser Code so wie er da ist, ist reiner Müll.
    Kategorie: Funstyle.
    Motto: Guckt mal was ich kann.
    Nutzen: 0
    :)

    P.S.:
    Achja ganz vergessen. Der Code berechnet PI, falls dir das was hilft. LoL


    hi,
    also ich muss mich stelzi anschliessen... zum lernen von c bringt es echt nix quellcode zu kopieren. so lernt man nicht zu programmieren. vorallem ist c eine recht "kontraintuitive" sprache. probiere es lieber selber, denn der code ist wirklich schrott... ohne kommentare und nix.... der programmierstil ist auch wirklich schlecht. so wird selbst in softwarefirmen nicht gearbeitet. falls du probleme mit c hast immer her damit. als kleinen tip:

    Galileo Computing :: C von A bis Z

    schau dir mal das openbook an. ist kostenlos und eigentlich gut fuer anfaenger geeignet.

    so long

    norf
  • Hallo,

    einen code mit dieser "einrückung" bin ich nicht gewillt zu analysieren ... -> debuggen :)

    cul8r

    Peter


    int a= 10000,
    b,
    c= 2800,
    d,
    e,
    f[2801],
    g;

    main() {
    for( ;b-c; ) f[b++]= a / 5;
    for( ;d= 0,g= c*2; c-= 14, printf("%.4d", e + d / a), e= d % a)
    for( b= c; d+= f * a, f[b]= d % --g, d/= g--, --b; d*= b);
    }

    PPS: for (i= 0; i < 10 ; i++) {foo}

    /*Diese Schleife würde von 0 bis 9 foo auswerten*/

    tip: schau dir mal operatoren und deren auswertungsreihenfolge an!
    tip2: da du diesen code nicht verstehst solltest du mit etwas anderem anfangen ,-)
    PPPS: es gibt nicht ohne grund doku-richtlinien :)
    PPPPS: meine einrückung ist auch nicht wirklich optimal ;)


    ... alleine schon, daß es ordentlich und ansi konform wäre folgendes hp zu deklarieren:

    int main (void) {
    ...
    return 0;
    }

    cul8r Peter
  • nimm diesen Code hier:

    C-Quellcode

    1. #include <iostream>
    2. #include <cmath>
    3. #include <cfloat>
    4. using namespace std;
    5. // die Konstanten LDBL_EPSILON und LDBL_DIG sind aus cfloat
    6. // und geben die kleinste darstellbare Zahl und die Anzahl
    7. // von Dezimalstellen von "long double" an.
    8. // Algorithmus aus:
    9. // "Handbook of Algorithms and Data Structures" G.H.Gonnet
    10. long double pi()
    11. {
    12. const long double epsilon = LDBL_EPSILON * 5;
    13. long double a, b, t, x, tempa;
    14. a = 1;
    15. b = sqrt(0.5);
    16. t = 0.25;
    17. x = 1;
    18. while ((a - b) > epsilon) {
    19. tempa = a;
    20. a = (a + b) / 2;
    21. b = sqrt(tempa * b);
    22. t = t - x * pow(a - tempa, 2);
    23. x = 2 * x;
    24. }
    25. return pow(a + b, 2.0) / (4 * t);
    26. }
    27. int main(void)
    28. {
    29. cout.precision(LDBL_DIG - 2); // Anzahl Nachkommastellen einstellen
    30. cout << pi();
    31. }
    Alles anzeigen


    Dein Code da oben ist für einen Anfänger ungeeignet und läuft so in vc++ nicht, da eine int main() immer einen Wert zurückgegen muss.

    cya chicken :lego:
    [SIZE=1]Dumme Antworten sind rein zufällig und auf einen Fehler in der Speicherverwaltung zurückzuführen
    [/SIZE]
  • ... hmm ... hmm ... fehlt in deinem main

    int main(void)
    {
    cout.precision(LDBL_DIG - 2); // Anzahl Nachkommastellen einstellen
    cout << pi();
    }

    nicht etwa ein return statement ... da ja ein int zurückgegeben werden sollte ?

    cul8r Peter