#define sin()

Gast #182039
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?
Gast #182042
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.
Gast #182043
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.
Gast #182047
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).
Gast #182048
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.
Gast #182049
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
Gast #182050
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren