Muss ich initialisieren schwimmt mit 0.f?
Wenn ich initialisieren float
Variablen in meinem Programm, ich haben allgemein Vektoren wie:
Vector forward(0.f,0.f,-1.f),right(1.f,0.f,0.f),up(0.f,1.f,0.f)
(Die Vektoren sind nur 3 Schwimmer wie struct Vector{ float x,y,z; };
)
Sieht viel einfacher zu Lesen als:
Vector forward(0,0,-1),right(1,0,0),up(0,1,0)
Muss Initialisiere ich meine float
Variablen mit float
s? Bin ich etwas zu verlieren oder aber irgendeine Art von Strafe, wenn ich ganze zahlen (oder double
s) zum initialisieren einer float
?
- Sie sollten nicht wirklich, Vektor-als eine Struktur, die name, denn das wird leicht verwechselt mit der stl::vector. Sie könnte stattdessen nennen Sie es so etwas wie vector3f oder vector3d
- In FORTRAN müssen Sie das entsprechende Zuordnung, also eine Doppel-null hat 0 zu sein.0d0, 0 nicht.0e0 oder 0. Eine Menge Leute, die starten mit FORTRAN verbrannt werden, durch dieses Verhalten und explizit 0 setzen.f in Ihrem C++ - code. C++ hingegen tatsächlich gibt die wie, um eine Literale 0 oder 1 das entsprechende floating-point-Wert.
- Ich denke, die Initialisierung wird nicht das problem sein. Jedoch, wenn Sie vergleichen, desto größer Datentyp verwendet wird (0.0 f gegen 0.0), so dass es dazu neigt, so werden langsamer. Es hängt natürlich auch von der use-case, aber nicht mit dem richtigen Typ sind Sie verursacht definitiv eine Umstellung. Entweder der Kompilierung oder zur Laufzeit. Vermeiden, es spart Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keinen semantischen Unterschied zwischen den beiden. Abhängig von einigen Compilern ist es möglich, für extra code generiert werden, obwohl. Siehe auch diese und diese ALSO Fragen zum selben Thema.
Kann ich bestätigen, dass
gcc
erzeugt den gleichen code für alle Varianten vonist, und dass dieser code ist
Die relevante Zeile ist
Ändern
a
zu0.1
(oder0.1f
) ändert sich die Zeile zuScheint es, dass
gcc
ist in der Lage, Rückschlüsse auf die richtige Konstante und nicht erzeugen zusätzlichen code.Für ein einzelnes literal, Konstante, es sollte keine Rolle spielen. Im Rahmen einer Initialisierung, einer Konstanten von beliebiger numerischer Typen werden implizit in den Typ des Objekts initialisiert werden. Gewährleistet wird dies durch die Sprache-standard. Also alle diese:
gleichermaßen gültig sind, und führen zu den gleichen Wert, gespeichert in
x
.Literal-Konstante in einem komplexeren Ausdruck überraschende Ergebnisse.
In den meisten Fällen, wird jeder Ausdruck ausgewertet wird, von selbst, unabhängig von dem Kontext, in dem es erscheint. Jede implizite Konvertierung angewendet wird nach der Teilausdruck ausgewertet wurde.
Also, wenn Sie schreiben:
den Ausdruck
1 /2
bewertet werden alsint
, was0
, die dann umgewandeltfloat. It will set
xto
0.0 f, not to
0,5 f`.Ich denke, Sie sollten sicher sein, mit unsuffixed Gleitkomma-Konstanten (das sind die der Typ
double
).Übrigens, sollten Sie überlegen, mit
double
eher alsfloat
in Ihrem Programm.double
, wie ich schon erwähnt habe, ist der Typ eines unsuffixed floating-point-Konstanten, und gedacht werden kann, in gewissem Sinne als die "Standard -" floating-point-Typ. Es hat in der Regel mehr Reichweite und Präzision alsfloat
, und es gibt in der Regel nicht viel Unterschied in der Leistung.Könnte es ein guter Programmier-Praxis, schreiben immer 0.f, 1.f usw., auch wenn oft gcc herausfinden können, was der Programmierer Mittel um 1,0 et al.
Problematische Fälle sind nicht so sehr trivial float-Variablen-Initialisierungen, aber numerische Konstanten in etwas komplexeren Formeln, in denen eine Kombination von Operatoren, float-Variablen und sagte Konstanten können leicht dazu führen, auftreten von unbeabsichtigten Doppel-bewertet Berechnungen und teuren float-double-float Konvertierungen.
Spotting diese Umbauten ohne ausdrückliche überprüfung der kompilierte code wird sehr hart, wenn die beabsichtigte Art für numerische Werte ist meist ausgelassen in den code und statt dessen nur enthalten, wenn es unbedingt erforderlich ist. Also ich würde den Ansatz wählen, der nur die Eingabe in die f-und immer verwendet, um mit Ihnen herum.