Brauche Hilfe beim Verstehen einer C-Zeile

Gast #1032452
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
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
@ 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
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

Eine eigene Frage? Dieser Thread ist über 18 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.