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.. 🙂
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.. 🙂
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
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.0f
anstatt 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.
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
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;
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