
Noi Sek
Ich frage, weil ich die Box2D-Bibliothek verwende, die hauptsächlich Float-Argumente erfordert. Obwohl ich eine Menge Beispielcode sehe, der die 0.00f Format, ich bin mir nicht ganz sicher, ob es einen tatsächlichen Unterschied zwischen diesem und dem einfachen alten gibt 0.00.
Werde ich mir später schaden, wenn ich das Zusatzzeichen nicht anfüge f? Ist es eine Sache der Geschwindigkeit? Gibt es eine Art Konnotation, die die benötigen würde f addend, wenn andere es nicht tun würden?
TL;DR: Warum sollte ich 0.00f statt 0.00 verwenden?

CodesInChaos
Das f
suffix macht es zu einem Literal mit einfacher Genauigkeit (Float) anstelle eines Literals mit doppelter Genauigkeit. Dies bedeutet normalerweise 32-Bit- statt 64-Bit-Gleitkommazahlen.
Fließkommakonstanten haben standardmäßig den Typ Double. Durch die Verwendung der Suffixe f oder l (oder F oder L — Groß- und Kleinschreibung wird beim Suffix nicht beachtet) kann die Konstante als float bzw. long double angegeben werden.
http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=VS.100).aspx

CB Bailey
Da ist ein Unterschied. 2.00
Typ hat double
und 2.00f
Typ hat float
. Die genaue Genauigkeit und die Auswirkungen auf das Format hängen von Ihrer Plattform ab. Ob die Verwendung von einem über dem anderen einen praktischen Unterschied in Ihrem Code macht, hängt vom Kontext ab, in dem es verwendet wird.
Als Initialisierer für eine explizit typisierte Variable (eines grundlegenden numerischen Typs) gibt es keinen Unterschied, aber wenn sie in einem Funktionsaufruf verwendet wird, kann sie möglicherweise beeinflussen, welche Überladung oder Vorlagenspezialisierung verwendet wird.
Offensichtlich, wenn es als Initialisierer in einer Deklaration mit verwendet wird auto
Typbezeichner oder als Ausdruck in einem decltype-Bezeichner wird der Typ des deklarierten Objekts beeinflusst.
decltype(2.00) x = 2.00f; // confusing
decltype(2.00f) y = 2.00; // also confusing
auto d = 2.00;
auto f = 2.00f;
Solange Sie sie a zuweisen float
es gibt absolut keinen Unterschied, da die Wert ist in allen numerischen Typen genau und richtig darstellbar.
Der wichtige Unterschied ist die Typ des wörtlichen, das ist double
zum 2.0
, float
zum 2.0f
und int
zum 2
. Es macht also einen Unterschied in der Argumenttypableitung:
void foo(int) { cure_cancer(); };
void foo(float) { wipe_hard_disk(); }
void foo(double) { exit(0); }
foo(2);
foo(2.0f);
foo(2.0);
Die Standardannahme ist double
. spezifizieren f
Suffix stellt sicher, dass es als a interpretiert wird float

Nawaz
Die Art von 2.00
ist double
und die Art von 2.00f
ist float
.
Das Suffix f
dreht das Wörtliche um 2.00
in einen Float-Typ umwandeln, was seine Genauigkeit verringert. Ansonsten ist wörtlich double
Typ.
-
Das Suffix beeinflusst die Typwas sich ändert wie eine Anweisung geparst wird
Das ändert sich nicht nur Art Abzug Ergebnis über decltype
und Auswahl der Funktionsüberlastung wie andere sagten, aber auch wie ein Ausdruck ausgewertet wird
Zum Beispiel 2.0 * x / 3
erfolgt in doppelter Genauigkeit, und 2.0f * x / 3
wird in Float-Präzision ausgeführt, wenn x ist float
. Dies kann zu unterschiedlichen Ergebnissen führen, da durch eine höhere Genauigkeit etwaige Zwischenfehler reduziert werden. Es wirkt sich auch stark auf die Leistung auf FPU-losen Systemen oder Systemen mit einer FPU aus float
nur, und es ist eine Sache, um die sich eingebettete Programmierer kümmern müssen. Demo auf Godbolt
Hier gehe ich davon aus FLT_EVAL_METHOD
Makro ist so eingestellt, dass Fließkommatypen nicht mit höherer Genauigkeit ausgewertet werden. Aber selbst wenn FLT_EVAL_METHOD >= 1
dann kann das Ergebnis mit und ohne Suffix immer noch unterschiedlich sein, wegen dem nächsten Punkt:
-
Das Suffix betrifft auch die Wert
In C++ muss der Wert korrekt auf den nächsten Wert im Zieltyp gerundet werden. Also zum Beispiel wenn wir haben
float f1 = 8388608.5000000009f;
float f2 = 8388608.5000000009;
dann f1
und f2
unterschiedliche Werte haben, weil das Suffix verhindert doppelte Rundung (d.h. zweimal runden, nicht der Typ double
) nicht passieren f2
(Dezimal → Double → Float). Der Dezimalwert wird auf den nächsten gerundet float
Wert direkt ein f1
(dezimal → float) ohne durchlaufen double
. Drucken Sie die Werte genauer aus und Sie werden sehen
Ein anderes Beispiel:
f1 = 7.038531e-26f;
f2 = 7.038531e-26;
Es gibt viele andere Beispiele, die Sie in sehen können die demo
Siehe auch
- Wann ändert das Anhängen eines ‘f’ den Wert einer Float-Konstante, wenn sie einem ‘float’ zugewiesen wird?
- Der Typ eines Gleitkommaliterals mit Exponent
- Notation von doppelten Gleitkommawerten in C und C++
- Was ist die Verwendung von Suffix
f
auf Float-Wert
- Gibt es einen Unterschied zwischen der Verwendung von Gleitkommaumwandlungen und Gleitkomma-Suffixen in C und C++?
- Was ist der Unterschied zwischen dem Umwandeln in „float“ und dem Hinzufügen von „f“ als Suffix beim Initialisieren eines „float“?
- “i < 0,7" ist nach einer Initialisierung "float i = 0,7" oben wahr?
10129200cookie-checkGibt es einen funktionalen Unterschied zwischen „2.00“ und „2.00f“?yes
Vielleicht möchten Sie sich diese Frage ansehen.
– Christian Rau
8. Oktober 2011 um 13:44 Uhr
oder diese stackoverflow.com/questions/2391818/…
– Epatel
8. Oktober 2011 um 14:22 Uhr