Welche Bedeutung hat 0.0f beim Initialisieren (in C)?

Lesezeit: 4 Minuten

Ich habe Code gesehen, in dem Leute Float-Variablen wie folgt initialisieren:

float num = 0.0f;

Gibt es einen signifikanten Unterschied zwischen diesem und dem folgenden Vorgehen?

float num = 0; 

Vielen Dank.. 🙂

  • Viele Duplikate, zB “f” nach Zahl/Float in Objective-C/C

    – PaulR

    4. März 2011 um 21:24 Uhr


  • Wahrscheinlich haben sie das f einmal weggelassen. Gebranntes Kind scheut das Feuer.

    – Hans Passant

    4. März 2011 um 21:25 Uhr

Benutzeravatar von EvilTeach
Böses Lehren

Schwimmer x = 0 hat eine implizite Typumwandlung von int nach float.
Schwimmer x = 0,0f hat keine solche Typumwandlung.
Schwimmer x = 0,0 hat eine implizite Typumwandlung von Double in Float.

Je nach Compiler kann die implizite Typumwandlung erfordern, dass der Compiler zusätzlichen Code generiert.

  • Wenn Sie einen Compiler haben, der die Typumwandlung zur Laufzeit durchführt, haben Sie größere Leistungsprobleme als eine zusätzliche Typumwandlung. Die einzige Ausnahme ist, wenn das genaue Fließkommaschema zur Laufzeit wählbar ist, in diesem Fall kann der Compiler nicht unbedingt wissen, was die richtige Typumwandlung ist (obwohl es in diesem Fall offensichtlich ist).

    – David Thornley

    4. März 2011 um 21:37 Uhr


  • Ja, das letzte Mal, als ich das Problem gesehen habe, war ein Vax C-Compiler.

    – EvilTeach

    4. März 2011 um 21:42 Uhr

  • dh die ausführbare Datei (leicht) aufblähen? Das ist nichts, was ein ausführbarer 4k-Wettbewerbsteilnehmer für akzeptabel halten würde, oder?

    – bobobobo

    28. September 2012 um 9:50 Uhr

  • Ich denke, Förderung ist der richtige Begriff. nicht typisiert. Alle Compiler müssten es tun, nicht nur vax c

    – EvilTeach

    26. Januar 2020 um 15:17 Uhr


Benutzeravatar von Steve Jessop
Steve Jessop

Wahrscheinlich liegt es daran, dass sie einmal etwas geschrieben haben wie:

float f = 1 / i; // i an integer

Nachdem sie das debuggt hatten, schworen sie, Literale immer ausreichend zu dekorieren, um den richtigen Typ zu erhalten:

float f = 1.0f / i;

In diesem Fall ist die .0 soll sicherstellen, dass die Division eine Fließkomma-Division ist, keine Integer-Division. Das f liegt daran, dass die Operation nicht durchgeführt werden muss double — Ich gehe davon aus, dass es dort mehr Chancen auf eine Implementierung gibt 1.0/i wäre bedeutend langsamer ohne Nutzen (Software-Float-Emulation, gleichgültige Optimierung) als eine wo 1.0f ist deutlich langsamer ohne Nutzen (wenn double schneller als float ist, liegt das daran, dass Sie fp-Hardware haben, also wird die Konvertierung zwischen den beiden sehr schnell sein, also nicht einführen von Bedeutung langsamer).

Wenn Sie sich angewöhnt haben, Literale zu dekorieren, könnten Sie gut schreiben:

float f = 0.0f;

obwohl es genau die gleiche Wirkung hat wie float f = 0.0; oder float f = 0;.

Natürlich ist der Autor möglicherweise nicht persönlich durch diese Offenbarung gegangen, er hat möglicherweise nur den Stil von jemand anderem geerbt, der dies getan hat.

Ich würde einfach schreiben 0.

R.. weist in einem Kommentar auf eine andere Antwort darauf hin, dass das Schreiben von 0 auch den Vorteil hat, dass wenn Sie den Typ ändern f In Zukunft müssen Sie das Literal nicht entsprechend aktualisieren. Und wenn die Zuweisung von der Definition getrennt ist, dann ändern:

float f = something
// some time later
f = 0.1f;

zu:

double f = something;
// some time later
f = 0.1f;

ist wohl ein bug. Besser zu verwenden 0.1 und lassen Sie den Compiler bei Bedarf auf Floating abschneiden. Sie könnten wahrscheinlich argumentieren, dass mit float überhaupt eine Optimierung ist, für den Platz, wenn nicht für die Zeit, und die Belastung durch den Umgang mit Unterschieden zwischen Float und Double sollte als Entwicklerkosten für die Durchführung dieser Optimierung gezählt werden.

Es wird nur als gute Praxis angesehen, eine Variable mit einer Literalkonstante des gleichen Typs zu initialisieren. In diesem Fall haben Sie eine Float-Variable und sollten sie mit einer Float-Literalkonstante initialisieren, dh 0.0fanstatt ein int (0), die dann implizit in einen Float umgewandelt wird.

Genau genommen ist 0 also eine ganze Zahl float num = 0 erfordert ein Casting von Integer nach Float. Aber ich nehme an, der Compiler erledigt das trotzdem für Sie. Ich denke, die Leute benutzen 0.0f um zu betonen, dass dies ein Float ist, damit niemand es mit einer Ganzzahl verwechselt.

Paul R hat die Antwort geschrieben. Ihr zweites Beispiel hat einen ganzzahligen Initialisierungswert.

Sie sollten immer einen Initialisierer desselben Typs wie die zu initialisierende Variable verwenden. Dies vermeidet jegliche Konvertierung zur Kompilierzeit (idealerweise) oder zur Laufzeit (faule Compiler: Sind aber irgendwelche so faul?). Und was vielleicht noch wichtiger ist, die Konvertierung kann im allgemeinen Fall zu einigen seltsamen Dingen führen.

Hier sollte die Konvertierung genau das tun, was erwartet wird, aber es ist immer noch guter Stil und vermeidet eine Compiler-Warnung.

Benutzeravatar von PyRick
Pyrick

‘f’ gibt an, dass Sie einen Float wünschen:

0 ist eine Ganzzahl

0f ist ein Float

0,0 ist ein Double

0.0f ist ein Float

Benutzeravatar von Punit Soni
Punit Soni

Ich sehe keinen Grund, dies für den Initialisierungsprozess zu verwenden. Aber für Operationen mit Gleitkommaliteralen wäre dies nützlich. Zum Beispiel;

float a=0.43, b;
b = 0.5*a + 2.56*a*a;

Fließkommaliterale ohne Suffix werden als Doubles betrachtet. Für diese Berechnung wird also „a“ in Double umgewandelt, und die endgültige Antwort der RHS-Bewertung ist ein Double. Während der Zuweisung wird der Double-Wert von RHS in Float umgewandelt und “b” zugewiesen. Dies würde die Leistung beeinträchtigen, wenn die Maschine keine FPU mit doppelter Genauigkeit hat. Um dies zu vermeiden und Float für die gesamte Berechnung zu verwenden. Suffixe verwendet werden. Zum Beispiel,

float a=0.43, b;
b = 0.5f*a + 2.56f*a*a;

1402400cookie-checkWelche Bedeutung hat 0.0f beim Initialisieren (in C)?

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

Privacy policy