habe versucht eine visuele anzeige(grafik lcd 132 x 176) für einen drehknopfregler zu schreiben, ich weiss dass mit einnen array mit 100 positionnen als tabelle werde dass auch funktz, mit der formel für komplexe zahlen bin ich in der lage positionen in der 2d ebene zu berechnen also einen kreis mit kerbe(oder kleiner strich) // d - abstand von dem mittelpunkt x = d*sin(winkel)+ startpunkt y = d*cos(winkel)+ startpunkt habe extra eine variable - winkel in der schleife vergrössert ,aber die werte die funktionnen sin(winkel) und cos(winkel) zuruck lifern sind immer 1,
sin und cos erwarten ihr Argument üblicherweise in Bogenmaß: 90° entspricht PI/2, 180° : PI ...
>sin und cos erwarten ihr Argument üblicherweise in Bogenmaß
was sie aber nicht daran hindert, Parameter aus dem gesamten
Wertebereich eines floats/doubles anzunehmen, und in den allermeisten
Fällen Ergebnisse ungleich 1 zu liefern.
Wenn immer 1 rauskommt, ist was anderes faul.
Oliver
>>sin und cos erwarten ihr Argument üblicherweise in Bogenmaß > > was sie aber nicht daran hindert, Parameter aus dem gesamten > Wertebereich eines floats/doubles anzunehmen, und in den allermeisten > Fällen Ergebnisse ungleich 1 zu liefern. Naja, die Funktionen sind ja auch periodisch. > Wenn immer 1 rauskommt, ist was anderes faul. Interessant wird das vor allem, weil angeblich beide 1 rausbekommen. Es gibt keinen Winkel, dessen Sinus und Kosinus beide 1 sind. Ich hätte gesagt, daß da vielleicht das Ergebnis in einem Integer gespeichert wird, aber so wie das oben geschrieben ist, kann das auch nicht sein.
Vermutlich ist aus irgendwelchen Gründen die Fliesskomma-Bibliothek nicht gelinkt.
am anfang habe ich die variable als unsigned char dann als float und auch als double aber es ist immer noch sin 1 und cos 1 wenn ich die formel x = d*sin(winkel) + startpunkt habe und dann die variable winkel von 0 bis 100 laufen lasse dann müssen da verschiedne werte rauskommen wenn ich die werte mit taschenrechnner berechnne dann und die dan eingebe als feste konstanten dann ist alles io frage ist wo finde ich die funktionen sin und cos in der math.h ist nur der verweiss auf eine externe funktion
> Es gibt keinen Winkel, dessen Sinus und Kosinus beide 1 sind.
In den reellen Zahlen gibt es das tatsaechlich nicht. Wenn aber ein
float oder double so gross wird, dass x + delta == x ist fuer
0 <= delta < 2*M_PI, koennen bei sin(x) und cos(x) lustige Dinge
passieren.
Wahrscheinlich kommt auch in diesem Fall nicht dasselbe heraus, aber man
sollte nie vergessen, welche Tuecken Fliesskomma-Zahlen haben.
@micha: Nicht von 0 bis 100 laufen lassen, sondern von 0 bis 100 / 180 *
M_PI. Wie oben erwaehnt wurde: Bogenmass, da macht es wenig Sinn Winkel
ueber 2*M_PI anzugeben, weil dadurch nur die Genauigkeit in den Keller
geht.
Zugegeben, bei 100 wird die Genauigkeit noch fuer einige
Nachkommastellen fuer sin(100) und cos(100) ausreichen. Wenn da 1
rauskommt, liegt das daran, was du mit dem Ergebnis anstellst, aber
sicher nicht an den Funktionen sin oder cos. Mein Tipp waere
Zwischenergebnisse ausgeben lassen, und wenn das nicht hilft Debugger
anwerfen und die Berechnung damit Schritt fuer Schritt nachvollziehen.
Irgendwo macht dein Code dein Ergebnis kaputt, denn sin und cos
funktioniert entweder ganz oder gar nicht (korrekte Winkel und Einbinden
von <math.h> vorausgesetzt (bzw. <cmath>, falls du in C++
programmierst)).
Die Mathe-Lib muss im Makefile angegeben werden. Verwendest du einfach WinAVR mit dem PN als IDE, muss im Makefile
1 | MATH_LIB = -lm |
stehen. Verwendest du AVR-Studio, dann musst du unter Project -> Configuration Options -> Libraries die Datei libm.a mit 'Add Library-->' zu den zu linkenden Dateien hinzufügen. Im Standard-WinAVR ist es automatisch drin, bei AVR-Studio nicht!
Wuerde sich ein Programm, das sin und cos benutzt, tatsaechlich linken lassen wenn die Math-lib nicht im Makefile steht?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.