Programm "Berechnung Sinus Reihe" stürzt ab. Warum?
-
Hallo zusammen,
hab mal wieder ein AnliegenUnd zwar sollte ich ein Programm schreiben, welches von einem eingegeben Winkel in Grad den Sinuswert ausgibt.
Bei einem Ausdruck KLEINER als 10^-5 soll diese Reihe dann beendet werden...
Wenn nun aber eine solche Zahl erscheinen sollte "rastet" mein Programm aus.
Kann mir jmd sagen wieso?#include <stdio.h> // Bibliothek fuer printf, scanf, ... #include <conio.h> // Bibliothek fuer getch, gets, ... #include <math.h> // Bibliothek fuer mathematische Funktionen ... #define PI 3.14159265358979 // Pi int main(void) { for(;;) { double degrees, bogenmass, summand_iplus1, summand_i = 1, sin_x = 0; //Deklaration int i = 1, sig = -1; printf("Bitte geben Sie einen Winkel in Grad ein: "); scanf("%lf", °rees); //long-float bogenmass = PI * degrees / 180.0; //Formel Bogenmass summand_iplus1 = bogenmass; //Übertrag Bogenmass zu Summand_iplus1 do { sig = -sig; sin_x = sin_x + sig * summand_iplus1; i=i+2; summand_i = summand_iplus1; summand_iplus1 = summand_i *bogenmass*bogenmass / i / (i-1); } while (fabs(summand_i) >= 0.00001); //Abbruch: Wert kleiner als 10^-5 printf("\nsin(x) = %lf (errechneter Wert)\n", sin_x); printf("sin(x) = %lf (Vergleichswert mit Bibliotheks -Funktion)\n\n", sin(bogenmass)); } printf("\n\nBitte eine Taste zum Beenden druecken!"); getch(); return 0; }
-
Buster92 schrieb:
Wenn nun aber eine solche Zahl erscheinen sollte "rastet" mein Programm aus.
Das tut mir Leid, hast du es schon mal mit Ausdruckstanz probiert?
Oder mit Paral? Das macht die Viecher ganz schnell ruhig.
-
Drücke dich klar aus. Mit "rastet aus" kann niemand etwas anfangen. Und bei welcher Eingabe genau tritt der Fehler auf.
Ich habe das Programm mal compiliert und ausgeführt, ein paar Werte eingegeben und weder mir noch dem Debugger sind dabei etwas ungewöhnliches aufgefallen.
-
@DirkB: Diese Dinge sagen mir nichts xD
Muss ich mal googeln.@ Sepp
Wenn ich bspw 1000000 Eingebe tut sich gar nichts mehr....also stoppt.
Ist ja eig richtig, oder?Ha ich glaube jetzt geht es?!
Hab noch .3 hinzugefügt
printf("\nsin(x) = %.3lf (errechneter Wert)\n", sin_x); //.3 = 3 Nachkommastellen
printf("sin(x) = %.3lf (Vergleichswert mit Bibliotheks-Funktion)\n\n", sin(bogenmass));jetzt stoppt das Programm
Also iwie geht es jetzt auch wenn ich .3 wegmache...Ganz komisch
-
Das "rastet aus" sagt mir bei einem Programm auch nicht viel.
Bevor du falsch googelst:
Paral ist ein Insektenspray. Also zum Insekten töten -> DebuggingDu kannst in deinem Programm auch ein paar Zwischenschritte ausdrucken (mit printf)
-
Falls du deine komischen Ergebnisse bei großen Zahlen meinst: Das ist schlicht und einfach dein Algorithmus. Der ist eben einfach numerisch höchst ungenau, weil du da riesige Zahlen verursachst. Ab einem gewissen Winkel bekommst du unendlich als Zwischenergebnis und dann terminiert die Schleife niemals mehr.
Wenn es dir da drum geht, den Sinus irgendwie von Hand zu berechnen, dann versuch es mal mit Tabellen und Interpolation oder dem CORDIC-Algorithmus. Wenn es dir da drum geht, genau diese Reihenentwicklung zu benutzen, musst du dir Gedanken da drüber machen, wie du die individuellen Zahlen die auftauchen ungefähr gleich groß halten kannst. Oder ganz clever: Benutze die Periode des Sinus und falte den Eingangswert auf etwas zwischen 0 und 360.