Wie teuer ist die Umwandlung von float
in double
? Ist es so trivial wie eine int
to long
Konvertierung?
EDIT: Ich nehme eine Plattform an, wo float 4 Bytes und double 8 Bytes
istDies hängt von der für die Float-Berechnung verwendeten Plattform ab. Mit x87 FPU ist die Konvertierung kostenlos, da der Inhalt des Registers gleich ist - der einzige Preis, den Sie manchmal bezahlen, ist der Speicherverkehr, aber in vielen Fällen gibt es sogar keinen Verkehr, da Sie den Wert einfach ohne Konvertierung verwenden können. x87 ist in dieser Hinsicht ein merkwürdiges Biest - es ist schwierig, richtig zwischen Floats und Doubles zu unterscheiden, da die verwendeten Befehle und Register identisch sind, was Lade- / Speicherbefehle unterscheidet und die Berechnungspräzision selbst wird mit Statusbits gesteuert . Die Verwendung von gemischten Float / Double-Berechnungen kann zu unerwarteten Ergebnissen führen (und es gibt Compiler-Befehlszeilenoptionen, um genaues Verhalten und Optimierungsstrategien zu steuern).
Wenn Sie SSE verwenden (und manchmal verwendet Visual Studio standardmäßig SSE), kann dies anders sein, da Sie möglicherweise den Wert in den FPU-Registern übertragen oder etwas explizites ausführen müssen, um die Konvertierung durchzuführen.
Als Zusammenfassung und Beantworten Ihres Kommentars an anderer Stelle: Wenn Sie Ergebnisse von Fließkommazahlen in 32b-Speicher speichern möchten, ist das Ergebnis gleich schnell oder schneller, weil:
Float to Double Conversions geschieht auf einigen Plattformen kostenlos (PPC, x86, wenn dein Compiler / Runtime den "zur Hölle mit welchem Typ du mir gesagt hast" benutze, werde ich sowieso alles in long double auswerten, nyah nyah "Bewertungsmodus).
In einer x86-Umgebung, in der Gleitkommaauswertung tatsächlich in dem angegebenen Typ unter Verwendung von SSE-Registern ausgeführt wird, sind Konvertierungen zwischen Float und Double ungefähr so teuer wie eine Fließkommaaddition oder -multiplikation (dh, es ist unwahrscheinlich, dass sie berücksichtigt wird) Du machst viel von ihnen).
In einer eingebetteten Umgebung ohne Hardware-Gleitkomma können sie etwas kostspielig sein.
Dies ist spezifisch für die C ++ - Implementierung, die Sie verwenden. In C ++ ist der Standard-Gleitkommatyp double . Ein Compiler sollte eine Warnung für den folgenden Code ausgeben:
%Vor%, weil der doppelte Wert 3,45 einem Float zugewiesen wird. Wenn Sie float spezifisch verwenden müssen, suffixen Sie den Wert mit f :
%Vor%Der Punkt ist, dass alle Fließkommazahlen standardmäßig double sind. Es ist sicher, sich an diesen Standard zu halten, wenn Sie die Implementierungsdetails Ihres Compilers nicht sicher kennen und kein signifikantes Verständnis der Fließkommaberechnung haben. Vermeide die Besetzung.
Siehe auch Abschnitt 4.5 der Programmiersprache C ++ .
Ich kann mir nicht vorstellen, dass es zu viel komplexer wäre. Der große Unterschied zwischen dem Konvertieren von int in long und dem Konvertieren von float in double besteht darin, dass die int-Typen zwei Komponenten (sign und value) haben, während Gleitkommazahlen drei Komponenten (sign, mantisse und exponential) aufweisen.
IEEE 754 single precision ist codiert in 32 Bits mit 1 Bit für das Zeichen, 8 Bits für den Exponenten und 23 Bits für der Signifikant. Es verwendet jedoch a verstecktes Bit, so ist der Signifikand 24 Bits (p = 24), obwohl es ist codiert mit nur 23 Bits.
- David Goldberg, Was jeder Informatiker über Gleitkommaarithmetik wissen sollte
Also wird das Konvertieren zwischen float und double das gleiche Vorzeichenbit beibehalten, die letzten 23/24 Bits der Float-Mantisse auf die Mantisse des Doppels setzen und die letzten 8 Bits des Float-Exponenten auf den Exponenten des Doppelten setzen.
Dieses Verhalten kann sogar von IEEE 754 garantiert werden ... Ich habe es nicht überprüft, also habe ich Ich bin mir nicht sicher.
ist wahrscheinlich etwas langsamer als das Konvertieren von int in long, da der Speicherbedarf größer und die Manipulation komplexer ist. Eine gute Referenz zu Problemen bei der Speicherausrichtung
Tags und Links c++ floating-point double