Forum: Compiler & IDEs #define sin()


von hahgeh (Gast)


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?

von JRB (Gast)


Lesenswert?


von Alex (Gast)


Lesenswert?

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

von hahgeh (Gast)


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.

von Alex (Gast)


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.

von tex (Gast)


Lesenswert?

vieleicht geht ja sowas


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

von hahgeh (Gast)


Lesenswert?

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

von tex (Gast)


Lesenswert?

ok, dann eben zu Fuß

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

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

von Chris (Gast)


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).

von hahgeh (Gast)


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.

von Jörg Wunsch (Gast)


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

von tex (Gast)


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

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
Noch kein Account? Hier anmelden.