Forum: Compiler & IDEs Präprozessor: Floating-Point zu Integer? (C++, Arduino)


von Kai (Gast)


Lesenswert?

1
#define FLOAT 1.23
2
#define INT 2
3
#define FLOATEGER FLOAT * INT

ist FLOATEGER 2.46 oder 2 ?

Kann ein float Ergebnis forciert werden?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Kai schrieb:
>
1
> #define FLOAT 1.23
2
> #define INT 2
3
> #define FLOATEGER FLOAT * INT
4
>
>
> ist FLOATEGER 2.46 oder 2 ?

Weder noch: es ist "1.23 * 2"

> Kann ein float Ergebnis forciert werden?

Da ist kein "Ergebnis", sondern nur Textersatz.

von Kai (Gast)


Lesenswert?

Mhh, ich dachte, "er" vereinfacht Konstanten?

von (prx) A. K. (prx)


Lesenswert?

Nein-

von Sebastian V. (sebi_s)


Lesenswert?

Kai schrieb:
> Mhh, ich dachte, "er" vereinfacht Konstanten?

Der Compiler kann das schon. In deinem Beispiel ist FLOATEGER ein double 
(wenn du float willst musst du ein 'f' anhängen) weil 1.23 ein double 
ist und nach den Konvertierungsregeln wird der int dann auch zu einem 
double. Wenn du einen bestimmten Typen willst kannst du immer noch einen 
Cast dran schreiben.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Kai schrieb:
>
1
> #define FLOAT 1.23
2
> #define INT 2
3
> #define FLOATEGER FLOAT * INT
4
>
>
> ist FLOATEGER 2.46 oder 2 ?
>
> Kann ein float Ergebnis forciert werden?

ja, in C++ kannst Du mit static_cast, den Typen eines Ausdrucks 
vorgeben:
1
constexpr float Ergebnis = static_cast< float >( FLOATEGER );

von Rolf M. (rmagnus)


Lesenswert?

Torsten R. schrieb:
> ja, in C++ kannst Du mit static_cast, den Typen eines Ausdrucks
> vorgeben:

Da kann man sich die ganzen #defines aber auch gleich sparen und 
stattdessen für alles echte Konstanten benutzen.

Sebastian V. schrieb:
> Kai schrieb:
>> Mhh, ich dachte, "er" vereinfacht Konstanten?
>
> Der Compiler kann das schon. In deinem Beispiel ist FLOATEGER ein double

Nein, es hat keinen Typ. Der ergibt sich erst später, nachdem das Makro 
ersetzt wurde. Das kann ggf. eben auch was unerwartetes sein, auch 
wenn's hier nicht so viele Möglichkeiten gibt. (short)FLOATEGER wäre 
z.B. vom Typ int und nicht etwa short, wie man annehmen könnte. Eben die 
typischen Makro-Probleme.

: Bearbeitet durch User
von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Rolf M. schrieb:
> Torsten R. schrieb:
>> ja, in C++ kannst Du mit static_cast, den Typen eines Ausdrucks
>> vorgeben:
>
> Da kann man sich die ganzen #defines aber auch gleich sparen und
> stattdessen für alles echte Konstanten benutzen.

Das war aber nicht die Frage ;-)

von Wilhelm M. (wimalopaan)


Lesenswert?

Torsten R. schrieb:
> Kai schrieb:
>>
1
>> #define FLOAT 1.23
2
>> #define INT 2
3
>> #define FLOATEGER FLOAT * INT
4
>>
>>
>> ist FLOATEGER 2.46 oder 2 ?
>>
>> Kann ein float Ergebnis forciert werden?
>
> ja, in C++ kannst Du mit static_cast, den Typen eines Ausdrucks
> vorgeben:
>
>
1
> constexpr float Ergebnis = static_cast< float >( FLOATEGER );
2
>

Aber wenn er schon C++ benutzen (soll), dann sollte er den CPP auch 
gleich für diesen Zweck entsorgen! In modernem C++ wird der CPP (fast) 
nur noch für include verwendet:
1
constexpr float f = 1.23f;
2
constexpr int i = 2;
3
constexpr float f3 = f * i;

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.