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