Wenn ich float
Variablen in meinem Programm initialisiere, habe ich häufig Vektoren wie:
(Vektoren sind nur 3 Floats wie struct Vector{ float x,y,z; };
)
Das sieht viel einfacher aus als:
%Vor% Muss ich meine float
Variablen mit float
s initialisieren? Verliere ich etwas oder mache eine Strafe, wenn ich Ganzzahlen (oder double
s) verwende, um float
zu initialisieren?
Es gibt keinen semantischen Unterschied zwischen den beiden. Abhängig von einigen Compilern kann jedoch zusätzlicher Code generiert werden. Siehe auch this und dies SO Fragen des gleichen Themas.
Ich kann bestätigen, dass gcc
den gleichen Code für alle Varianten von
und dass dieser Code
ist %Vor%Die relevante Zeile ist
%Vor% Durch das Ändern von a
in 0.1
(oder 0.1f
) wird die Zeile in
Es scheint, dass gcc
in der Lage ist, die korrekte Konstante abzuleiten und keinen zusätzlichen Code generiert.
Für eine einzelne Literalkonstante sollte das keine Rolle spielen. Im Zusammenhang mit einem Initialisierer wird eine Konstante eines beliebigen numerischen Typs implizit in den Typ des Objekts konvertiert, das initialisiert wird. Dies wird durch den Sprachstandard garantiert. Also all diese:
%Vor% sind gleichermaßen gültig und führen dazu, dass der gleiche Wert in x
gespeichert wird.
Eine Literalkonstante in einem komplexeren Ausdruck kann jedoch überraschende Ergebnisse haben.
In den meisten Fällen wird jeder Ausdruck unabhängig von dem Kontext, in dem er angezeigt wird, für sich ausgewertet. Jede implizite Konvertierung wird angewendet nachdem der Teilausdruck ausgewertet wurde.
Also wenn du schreibst:
%Vor% Der Ausdruck 1 / 2
wird als int
ausgewertet, was 0
ergibt, welches dann in float. It will set
x to
0.0f , not to
0.5f 'umgewandelt wird.
Ich denke, Sie sollten sicher sein, dass Sie keine Fließkomma-Konstanten verwenden (die vom Typ double
sind).
Übrigens könnten Sie double
anstelle von float
in Ihrem Programm verwenden. double
ist, wie ich bereits erwähnt habe, der Typ einer nicht fixierten Gleitkommakonstante und kann in gewisser Hinsicht als "Standard" -Flugpunkttyp betrachtet werden. Es hat normalerweise mehr Reichweite und Genauigkeit als float
, und es gibt normalerweise nicht viel Unterschied in der Leistung.
Es könnte eine gute Programmierpraxis sein, immer 0.f, 1.f usw. zu schreiben, auch wenn oft gcc herausfinden kann, was der Programmierer mit 1.0 et al. meint.
Die problematischen Fälle sind nicht so sehr triviale float-Variableninitialisierungen, sondern numerische Konstanten in etwas komplexeren Formeln, wo eine Kombination von Operatoren, float-Variablen und besagten Konstanten leicht zum Auftreten von ungewollten doppeltwertigen Berechnungen und teurem float-double führen kann -Float-Conversions.
Diese Conversions zu erkennen, ohne den kompilierten Code für sie speziell zu überprüfen, wird sehr schwierig, wenn der vorgesehene Typ für numerische Werte im Code größtenteils weggelassen wird und stattdessen nur dann eingefügt wird, wenn dies unbedingt erforderlich ist. Daher würde ich für den einen den Ansatz wählen, einfach die fs einzugeben und sich daran zu gewöhnen, sie herum zu haben.
Tags und Links c++ initialization variables