Float in Double konvertieren

8

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

ist     
Tony the Pony 14.09.2009, 13:54
quelle

6 Antworten

10

Überlegungen zur Plattform

Dies 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.

Speicherersparnis

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:

  • Wenn Sie dies auf x87 tun, ist die Konvertierung frei - der einzige Unterschied ist, dass fstp dword [] anstelle von fstp qword [].
  • verwendet wird
  • Wenn Sie dies mit aktiviertem SSE tun, können Sie sogar einen gewissen Leistungszuwachs sehen, da einige Gleitkomma-Berechnungen mit SSE durchgeführt werden können, wenn die Genauigkeit der Berechnung nur vom Standardwert double ist.
  • In allen Fällen ist der Speicherverkehr geringer
Suma 14.09.2009, 14:16
quelle
5

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.

    
Stephen Canon 14.09.2009 14:48
quelle
0

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 ++ .

    
Vijay Mathew 14.09.2009 14:15
quelle
0

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.

    
Powerlord 14.09.2009 14:18
quelle
-1

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

    
vehomzzz 14.09.2009 14:07
quelle
-1

Vielleicht diese Hilfe:

%Vor%     
Skywrath 07.05.2016 16:57
quelle

Tags und Links