Muss ich Floats mit 0.f initialisieren?

8

Wenn ich float Variablen in meinem Programm initialisiere, habe ich häufig Vektoren wie:

%Vor%

(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?

    
bobobobo 28.09.2012, 09:47
quelle

3 Antworten

7

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

generiert %Vor%

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

geändert %Vor%

Es scheint, dass gcc in der Lage ist, die korrekte Konstante abzuleiten und keinen zusätzlichen Code generiert.

    
Mihai Maruseac 28.09.2012 09:49
quelle
3

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.

    
Keith Thompson 23.05.2013 19:27
quelle
1

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.

    
JustMy2Cents 23.05.2013 19:08
quelle

Tags und Links