#define sin()

Gast #182039
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
Die nutzt ja die sin () - Funktion auch. Ansatz sollte trotzdem stimmen.
Einfach wäre es, einfach nen Taschenrechner (Windowsrechner) dafür zu
nehmen.
Gast
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
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
> #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
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
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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.