mikrocontroller.net

Forum: Compiler & IDEs sin cos berechnu


Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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,

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sin und cos erwarten ihr Argument üblicherweise in Bogenmaß: 90° 
entspricht PI/2, 180° : PI ...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>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.

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich ist aus irgendwelchen Gründen die Fliesskomma-Bibliothek 
nicht gelinkt.

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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)).

Autor: Uwe Nagel (ulegan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Mathe-Lib muss im Makefile angegeben werden.
Verwendest du einfach WinAVR mit dem PN als IDE, muss im Makefile
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!

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wuerde sich ein Programm, das sin und cos benutzt, tatsaechlich linken 
lassen wenn die Math-lib nicht im Makefile steht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.