Forum: Compiler & IDEs Brauche Hilfe beim Verstehen einer C-Zeile


von FrageMan (Gast)


Lesenswert?

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

von schuppi (Gast)


Lesenswert?

if(X < 0.0)  (int)(32768*(X) - 0.5);
else         (int)(32767*(X) + 0.5);

jaja so ist das

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Umwandlung einer float Zahl in (bitof(int) - 15).15 Fixpointformat?

Matthias

von Sven P. (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

@ 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.
??

von Sven P. (Gast)


Lesenswert?

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