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?
Vielleicht über ne Taylorreihe? http://home.in.tum.de/~prilmeie/tgi/maschinen/entwicklerdokumentation.html#entwicklerdokumentation
Die nutzt ja die sin () - Funktion auch. Ansatz sollte trotzdem stimmen. Einfach wäre es, einfach nen Taschenrechner (Windowsrechner) dafür zu nehmen.
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.
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.
vieleicht geht ja sowas #define PARAMETER 10 #define ZAHL SIN((PARAMETER % pi)*pi)
ok, dann eben zu Fuß #define ZAHL SIN( (PARAMETER - (int)(PARAMETER / pi) * pi ) aber ich glaube ich hab sowieso die Frage flasch verstanden...
> #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).
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.