Brauche Hilfe beim Verstehen einer C-Zeile

Gast #1032452
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))
Gast #1032800
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.
Moderator (Firma: Titel) Persönliche Seite #1033042
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.
??
Gast #1033055
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren