Sinus



  • Hallo,
    ich hab grad ein kleines Programm geschrieben, welches mit annäherugsweise immer genauer Pi bestimmt. Als ich die Formel auf einem Blatt Papier mir hergeleited habe und ausprobiert hatte, hat alles wunderbar geklappt! Also die Formel ist 100% richtig! hier mein Quelltext:

    #include <iostream.h>
    #include <math.h>
    
    void main(){
    
    	double n = 1;			// n sind die Ecken des n-Eck im Kreis	
    	float pi = 0.0;			// pi ist der Umfang des n-Ecks
    
    	while(n<10){			// testweise nur ersteinmal 10 Näherungen
    		pi = n*sin((360/(2*n));
    		cout << "pi = " << pi << "\t\tn = " << n << endl;
    		n++;			// nächste Näherung: n-Eck bekommt 1 Ecke mehr
    	}
    }
    

    nur leider erscheint kein richtiges Ergebnis! Es muss an der Sinusfunktion liegen, denn wenn ich z.B. sin (270) eingebe,m erscheint dann auch nicht -1.
    Mir ist dann eingefallen, dass man möglicherweise mit sin() sin(X) berechnet und nicht sin(ALPHA), dann müsste ich den Termin, den ich der Sinusfuntion übnergebe nur noch mit "*2*PI/360" ergänzen und es klappt! Nur dazu muss ich ja Pi eingeben, aber mein Ziel ist ja die immer genauer werdende Annäherung an Pi! Somit kann mein ausgrechnetes Pi max. so genau sein, wie das, was ich in dem Term verwende und das ist ja nicht der sinn und zweck der ganzen geschichte! Kann mir jemand helfen, gibt es auch eine Sinusfunktion für den Gradmaß?



  • Och Jungs, wie oft gabs das denn nun schon? Die C-Funktionen benutzen (wie jeder anständige Mathematiker/Ingenieur/Informatiker usw...) nunmal das Bogenmaß. Wie rechnet man das um? Darauf ist die vor-Pisa-Generation auch schonmal von alleine gekommen, einfacher Dreisatz. Bogenmaß = Gradmaß / 180° * Pi

    aber auch jedesmal....



  • Dingo schrieb:

    Och Jungs, wie oft gabs das denn nun schon? Die C-Funktionen benutzen (wie jeder anständige Mathematiker/Ingenieur/Informatiker usw...) nunmal das Bogenmaß. Wie rechnet man das um? Darauf ist die vor-Pisa-Generation auch schonmal von alleine gekommen, einfacher Dreisatz. Bogenmaß = Gradmaß / 180° * Pi

    aber auch jedesmal....

    sra, aber dieses mal ist es eben nicht so einfach! wenn ich für pi z.B. "3.1415" wähle, dann wird meine max annäherung von pi auch nur 3.1415 ergeben! ich will ja wissen, was pi ist und da kann ich nicht in der rechnung pi verwenden!
    brauche also eine sinus funktion im gradmaß ohne umreczhnung von bogenmaß ins gradmaß!



  • mit der sinus funktion bekommst du kein pi raus.
    sinus benutzt selbst pi.
    dann guck mal besser, ob du mit floats rechnest.
    beispiel: 5/10 ist nicht 0.5 sondern 0, weil hier mit ints gerechnet wird.



  • c.rackwitz schrieb:

    mit der sinus funktion bekommst du kein pi raus.
    sinus benutzt selbst pi.
    dann guck mal besser, ob du mit floats rechnest.
    beispiel: 5/10 ist nicht 0.5 sondern 0, weil hier mit ints gerechnet wird.

    hmmm, dann kann man pi ja sicher noch mit anderen varianten "ausrechnen", ok, dann werde ich mal schaun, ob ich pi näherungsweise berechnen kann, ohne sinus zu verwenden...
    zum code: ich hatte doch gar keine ints verwendet!?



  • sinus benutzt selbst pi.

    Also ich bin sicher das wenn das schon nicht als lookuptable implemtentiert ist taylorpolynome verwendet werden... Pi sollte da keine Rolle spielen...

    hmmm, dann kann man pi ja sicher noch mit anderen varianten "ausrechnen"

    kannst du auch mit polynomen approximieren... google einfach mal danach...



  • Natürlich wird das als LUT realisiert sein, aber auch zu ungenau, um da pi mit weißichncihtwievielen Stellen draus gewinnen zu können 🙄

    Eine unschicke aber leicht nachzuvollziehende Methode an pi zu kommen : nimm dir ein 2D Bitfeld, dadrin "zeichnest" du dir einen ausgefüllten kreis (alle Bits mit Abstand a<=R vom Mittelpunkt setzen). Den Abstand berechnest du dabei über Phytagoras. Danach zählst du die Bits aus und hast damit die Fläche. Die Fläche ist gleich pi*r^2, da r bekannt ist, kannst du pi annähern. Braucht natürlich auch kein ganzkreis zu sein, ein Ausschnitt reicht.



  • da gibts nen pi algorithmus, der mir nach polynom aussieht, iterativ.
    ist python, also ist portieren angesagt.
    http://docs.python.org/lib/decimal-recipes.html



  • /* A spigot algorithm for the Digits of \pi, Stanley Rabinowitz
       and Stan Wagon, Amer.Math.Monthly, March 1995, 195-203
    */
    
    #include <stdio.h>
    
    #define N 1000
    #define LEN 10*N/3
    
    main()
    {
    int i, j, k, q, x, nines, predigit;
    long a[LEN];
    
    for(j=0;j<LEN;j++) a[j]=2;
    nines=0; predigit=0;
    for(j=0;j<N;j++) {
            q=0;
            for(i=LEN;i;i--) {
               x = 10*a[i-1] + q * i;
               a[i-1] = x % (2*i-1);
               q = x / (2*i-1);
            }
            a[0] = q % 10; q = q / 10;
            if (q==9) { nines++; }
            else if (q==10) { printf("%d",predigit+1); predigit=0;
                              for(;nines;nines--) printf("%d",0);
                            }
            else { printf("%d",predigit); predigit = q;
                   for(;nines;nines--) printf("%d",9);
                 };
    };
    printf( "%d\n", predigit );
    }
    


  • Wie mies ist denn das gecoded 👎



  • Das war ein Mathematiker, kein Programmierer.



  • Hätte auch ein Kiddy sein können welches sich für einen cewlen coda hällt, nur weil es besonders unleserlichen C-Code schreibt 😃



  • Software ist nun mal härter als Hardware. Wenn ein Code schwer zu schreiben war, dann soll er auch schwer zu lesen sein.



  • tztztz
    code soll schön und inhaltlich kompakt sein.
    ordentliche formatierung gibts als plugin für jeden editor.



  • Könnte es vielleicht sein, daß Megatrolls Antwort ironisch gemeint war?


Anmelden zum Antworten