Problem mit cos(x) und sin(x)

Hyp

Grünschnabel
Hallo,

ich hab ein kleines Problem mit der Berechnung von cos und sin! Die math.h habe ich eingebunden und es Funktioniert soweit ganz gut!

Ich habe in meiner Berechnung folgendes stehen cos(i*x) wobei i ein Mulitplikator ist und x die Position von 0 bis 2*pi, solange i nicht größer als 100 bzw. 1000 wird der Cos korrekt ausgerechnet aber darüber hinaus kommt dann nur noch 1 für den Cos raus.

Ich habe dann mal meinen Taschenrechner bemüht und Cos(65) mal ausgerechnet ist nach ihm 0.4226.... aber laut dem C-Algorithmus ist es 1 :confused: Bei der Sinusfunktion stellt sich das gleiche Problem auch ein ab einer bestimmten größe!

Ich weiß jetzt nicht ob das so bedingt ist bei den Funktionen, was ziemlich seltsam wäre, oder ob ich doch etwas falsch mache. Ich mein solange der Multiplikator nicht extrem groß wird (was sich allerdings bei meinem Rechenproblem nicht vermeiden lässt) funktioniert alles wunderbar. Gibt es eine Lösung für dieses Problem oder muss ich da ganz anders ran gehen!

Danke schon mal im Vorraus
 
Ich denke mit dem berechneteten Parameter "i*x" geht irgendwas schief. Da solltest du mal die Ergebnisse und Eingabewerte prüfen. Insbesondere implizite Typkonvertierungen (int <-> double o.ä.) können unter Umständen nach hinten losgehen.

Wenn du die Funktion "cos(65)" direkt als Programmzeile nimmst, kommt auch ein Wert ungleich 1 heraus: 0.5624... . Der Unterschied zum Taschenrechner ergibt sich daraus, das dieser den Parameter als DEG, die C-Funktion aber als RAD interpretiert.
 
DIe Funktionen sin und cos haben keinen unendlichen Eingangsbereich, die kann je nach System / Prozessor/library unterschiedlich sein ... bei dem von mir benutzten DSP in der Arbeit ist die Funktion nur für Werte zwischen -1000.0 und 1000.0 im bestimmten maß richtig und danach sind die werte nicht mehr korrekt ... kanst ja mal ein COde Fragment posten ... weil unter windows libc sollte der Bereich jedoch net begrenzt sein ... alsobei mir gehts auch mit argumenten > 1000
 
Macht sehr wohl Sinn, und ist implementiert!

Stichwort fmod und fmodf sowie fmodl

x=a*y+r mit als Divisor, y als Quotient, r als Rest, x als Divident
(Definition der entsprechenden Restklasse [r] ist nicht beschränkt auf Ganzzahlen)

greez
Johannes
 
Danke für die zahlreichen Antworten, ich glaube es lag wirklich an der Typumwandlung von int auf double. Muss das aber erstmal einem umfangreichen Test unterziehen.

Ansonsten werde ich mich mal Tip für Tip durcharbeiten. :-)
 
Zurück