Hallo, ich habe in einer .h Datei folgende Definition gesehen, und da diese Q15(X) in einem Beispiel Code verwendet wird, möchte ich verstehen, was diese Funktion eigentlich macht. Könnt mir bitte jemand helfen? #define Q15(X) \ ((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
if(X < 0.0) (int)(32768*(X) - 0.5); else (int)(32767*(X) + 0.5); jaja so ist das
Hi Umwandlung einer float Zahl in (bitof(int) - 15).15 Fixpointformat? Matthias
schuppi wrote: > if(X < 0.0) (int)(32768*(X) - 0.5); > else (int)(32767*(X) + 0.5); > > jaja so ist das Blödsinn.
1 | #define Q15(X) \
|
2 | ((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
|
"\" setzt die Definition in der nächsten Zeile fort. Da steht ein bedingter Ausdruck:
1 | (
|
2 | (X < 0.0) ? /* WENN X < 0.0 */ |
3 | (int) (32768 * (X) - 0.5) : /* DANN nimm diesen Ausdruck */ |
4 | (int) (32767 * (X) + 0.5) /* SONST diesen hier. */ |
5 | )
|
Der Ausdruck selbst:
1 | (int) (32768 * (X) - 0.5) |
multipliziert die Kommazahl "X" (vermutlich Kommazahl, weil ja auch mit "0.0" verglichen wird) mit 32768 (macht sie quasi wortbreit, =2^15), zieht von dem Ergebnis ein Halb ab und verwirft danach die Kommastellen. Ansonsten: Jo, das sieht nach Umwandlung in Festkommazahl aus.
@ Sven Pauli (haku) Ich kann mir nicht helfen, aber das > if(X < 0.0) (int)(32768*(X) - 0.5); > else (int)(32767*(X) + 0.5); ist für mich das selbe wie das: > (X < 0.0) ? /* WENN X < 0.0 */ > (int) (32768 * (X) - 0.5) : /* DANN nimm diesen Ausdruck */ > (int) (32767 * (X) + 0.5) /* SONST diesen hier. */ Weshalb also > Blödsinn. ??
Lothar Miller wrote: > @ Sven Pauli (haku) > Ich kann mir nicht helfen, aber das >> if(X < 0.0) (int)(32768*(X) - 0.5); >> else (int)(32767*(X) + 0.5); > > ist für mich das selbe wie das: >> (X < 0.0) ? /* WENN X < 0.0 */ >> (int) (32768 * (X) - 0.5) : /* DANN nimm diesen Ausdruck */ >> (int) (32767 * (X) + 0.5) /* SONST diesen hier. */ > > Weshalb also >> Blödsinn. > ?? Weils Blödsinn ist. Deine IF-Version wird dem bedingten Ausdruck mit seinem beabsichtigten Einsatzzweck NICHT gerecht. Denk mal nach: Welche Effekte hat
1 | (int)(32768*(X) - 0.5) |
eigentlich? Richtig -- garkeine. Da wird ein wenig rumgerechnet und danach ist alles so wie vorher. Deine IF-Konstruktion wird so vom Kompiler schlicht wegoptimiert, und das zu Recht, weil sie effektiv nichts bewirkt. Ganz anders dagegen der bedingte Ausdruck: der bewirkt zwar selbst auch nichts, aber man kann mit ihm weiterrechnen: Bedingter Ausdruck:
1 | #define Q15(X) \
|
2 | ((X < 0.0) ? (int) (32768 * (X) - 0.5) : (int) (32767 * (X) + 0.5))
|
3 | |
4 | if (Q15(...) == ...) {} |
5 | /* oder */
|
6 | variable = Q15(...); |
7 | |
8 | /* funktioniert */
|
Dein IF-Dings:
1 | #define Q15(X) \
|
2 | if(X < 0.0) (int)(32768*(X) - 0.5); else (int)(32767*(X) + 0.5);
|
3 | |
4 | if (Q15(...) == ...) {} /* Syntaxfehler */ |
5 | variable = Q15(...); /* Syntaxfehler */ |
Das If-Ding müsstest du so formulieren:
1 | #define Q15(X, Y) \
|
2 | if(X < 0.0) \
|
3 | Y = (int)(32768*(X) - 0.5); \
|
4 | else \
|
5 | Y = (int)(32767*(X) + 0.5);
|
6 | |
7 | /* Damit wäre zumindest sowas möglich: */
|
8 | Q15(..., variable); |
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.