www.mikrocontroller.net

Forum: Compiler & IDEs #define sin()


Autor: hahgeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich wollte sowas in der Art machen:

#define PARAMETER 10

#define ZAHL SIN(PARAMETER)

also ZAHL soll der Sinus von 10 sein. Weil die Originalformel noch
etwas komplizierter ist, und ich nur den Parameter mal ändern möchte
ohne jedesmal die Formel neu auszurechnen.
Nur funktioniert das leider nicht mit dem Sinus, bei "normalen"
Operatoren rechnet der Kompiler alles vorher aus. Wenn ich sin() aus
math.h verwende bläht sich der Code wieder unnötig auf.

Kennt jemand vielleicht eine Lösung dafür?

Autor: JRB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die nutzt ja die sin () - Funktion auch. Ansatz sollte trotzdem stimmen.
Einfach wäre es, einfach nen Taschenrechner (Windowsrechner) dafür zu
nehmen.

Autor: hahgeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der Taylorreihe ist auch wieder nicht so einfach, weil entweder
eine Schleife gebraucht wird, oder zumindest eine Art Rundungsoperator,
der zur Compile-Zeit ausgeführt werden muß(gibt es wahrscheinlich auch
nicht), damit auch Zahlen größer als PI genau berechnet werden können.

Naja wahrscheinlich muß ich dann wohl doch jedesmal den Taschenrechner
zur Hand nehmen.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder du tippst die Taylorreihe selbst als Funktion ein (in C kein
Aufwand) und lässt dir das Ergebnis während der Initialisierung
ausrechnen. Das belastet den MC nicht während der Laufzeit und sehr
viel Code wird es auch nicht. Du brauchst ja nur die Grundrechenarten
dafür.

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vieleicht geht ja sowas


#define PARAMETER 10
#define ZAHL SIN((PARAMETER % pi)*pi)

Autor: hahgeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das % - Zeichen ist leider nur für ganzzahlige Operatoren zulässig.

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, dann eben zu Fuß

#define ZAHL SIN( (PARAMETER - (int)(PARAMETER / pi) * pi )

aber ich glaube ich hab sowieso die Frage flasch verstanden...

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #define ZAHL SIN( (PARAMETER - (int)(PARAMETER / pi) * pi )

Irgendwie steh ich gerade auf dem Schlauch, was die Bedeutung dieser
Zeile angeht...

Jedes Vorkommen des Tokens "ZAHL" wird nun durch SIN(bla) ersetzt?
Oder soll ZAHL nur ein Platzhalter für eine bestimmte Zahl sein (was
mit dem C-Präprozessor aber gar nicht geht)?

Ich denke der OP braucht (wenn er bei seinem Ansatz bleiben will) eine
Tabelle mit Werten, also z.B.:
double sin_table[255] = { /* Viertel einer Sinus-Periode }

Ein Viertel der Periode reicht, da sich die restlichen Werte durch
Invertierung o.ä. ermitteln lassen. Man könnte sich nun eine
inline-Funktion schreiben, die mit dieser Tabelle arbeitet. Aber der
C-Präprozessor ist dafür ungeeignet (soweit ich das Problem verstanden
habe).

Autor: hahgeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal für die ganzen Mühen.

Um mein Anliegen noch einmal etwas verstänlicher zu machen schreibe ich
nun nochmal, obwohl sich das Problem eigentlich schon so gut wie
erledigt hat, weil ich die Sinusfunktion im richtigen Programm sowieso
noch benutze, und sie damit sowieso schon im Flash steht.

Also:
Der Wert des Sinus (eigentlich eine kompliziertere Gleichung mit
mehreren sin und cos) soll beim Compilieren berechnet werden, so daß
nachher im Programmcode bzw. im Flash nur noch eine konstante
double-Zahl steht und kein Code zum berechnen dieser Zahl.
Und damit ich nicht bei jeder Parameteränderung die Formel neu
berechnen muß sollte das der Präprozessor für mich tun.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Präprozessor kann keine Gleitkomma-Operationen, von einer
Bibliothek im Hintergrund ganz zu schweigen.

Klar könnte der Compiler theoretisch einen zur Compilezeit konstanten
Ausdruck tatsächlich vorberechnen (vorausgesetzt du spezifizierst
nicht gar noch -ffreestanding, nur damit du für das berüchtigte "void
main(void)" keine Warnung bekommst ;-), aber zumindest der aktuelle
GCC tut das nicht für Gleitkomma-Funktionsaufrufe, und verlassen würde
ich mich auf sowas erst recht nicht.

Also bleibt dir nur, es umständlich mit selbstberechneten Konstanten
zu machen:

#define SIN_1 .841470
#define SIN_2 .909297

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na das wird ja dann wohl ein längeres Define...
Wenn Du nicht alles selber tippen willst hilft ja vieleicht das hier,
falls Du zufällig Zugriff auf eine weit verbreitete Tabellenkalkuation
hast. Nur die Kommas austauschen nicht vergessen ...

="#define SIN_"&TEXT(A1;"0,00")&" "&TEXT(B1;"0,000000")

0,01  0,009999833  #define SIN_0,01 0,010000
0,02  0,019998667  #define SIN_0,02 0,019999
0,03  0,0299955  #define SIN_0,03 0,029996
0,04  0,039989334  #define SIN_0,04 0,039989
0,05  0,049979169  #define SIN_0,05 0,049979
0,06  0,059964006  #define SIN_0,06 0,059964
0,07  0,069942847  #define SIN_0,07 0,069943
0,08  0,079914694  #define SIN_0,08 0,079915
0,09  0,089878549  #define SIN_0,09 0,089879
0,1  0,099833417  #define SIN_0,10 0,099833
0,11  0,109778301  #define SIN_0,11 0,109778
0,12  0,119712207  #define SIN_0,12 0,119712
0,13  0,129634143  #define SIN_0,13 0,129634
0,14  0,139543115  #define SIN_0,14 0,139543
0,15  0,149438132  #define SIN_0,15 0,149438
0,16  0,159318207  #define SIN_0,16 0,159318
0,17  0,169182349  #define SIN_0,17 0,169182
0,18  0,179029573  #define SIN_0,18 0,179030
0,19  0,188858895  #define SIN_0,19 0,188859
0,2  0,198669331  #define SIN_0,20 0,198669
0,21  0,2084599  #define SIN_0,21 0,208460
0,22  0,218229623  #define SIN_0,22 0,218230

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.