Gibt es einen funktionalen Unterschied zwischen „2.00“ und „2.00f“?

Lesezeit: 5 Minuten

Benutzer-Avatar
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?

  • 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

Benutzer-Avatar
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

  • Vielleicht ist “literal” besser geeignet als “constant”. Die Art der wörtlich ist, was in Frage kommt.

    – Kerrek SB

    8. Oktober 2011 um 13:41 Uhr

  • float Es ist nicht nötig 32 bit in Größe. Es ist implementierungsdefiniert.

    – Nawaz

    8. Oktober 2011 um 13:41 Uhr


  • Danke, Sie haben Recht, “wörtlich” scheint in diesem Zusammenhang angemessener zu sein. Teil mit fester Bitgröße.

    – CodesInChaos

    8. Oktober 2011 um 13:41 Uhr


  • Wie viele Speicherbits und welche Genauigkeit die Typen benötigen, hängt von der Implementierung ab. 32- und 64-Bit-Speicher sind üblich, aber nicht universell.

    – CB Bailey

    8. Oktober 2011 um 13:42 Uhr

  • Die Frage ist also: Gibt es eine “Dezimalzahl”, die durch den Doppelsprung zwischen Double und Float an Genauigkeit verliert? Und wenn ja, führen die Compiler wirklich die Konvertierung durch?

    – xanatos

    8. Oktober 2011 um 13:42 Uhr

Benutzer-Avatar
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 floates 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

Benutzer-Avatar
Nawaz

Die Art von 2.00 ist doubleund 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?

1012920cookie-checkGibt es einen funktionalen Unterschied zwischen „2.00“ und „2.00f“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy