Wie konvertiere ich Float in Double (beide in IEEE-754-Darstellung gespeichert), ohne an Genauigkeit zu verlieren?

Wie konvertiere ich Float in Double (beide in IEEE-754-Darstellung gespeichert), ohne an Genauigkeit zu verlieren?


Ich meine, zum Beispiel habe ich die folgende Zahl in IEEE-754 einfacher Genauigkeit codiert:


"0100 0001 1011 1110 1100 1100 1100 1100"  (approximately 23.85 in decimal)

Die obige Binärzahl wird in einer Literalzeichenfolge gespeichert.


Die Frage ist, wie kann ich diese Zeichenfolge in eine IEEE-754-Darstellung mit doppelter Genauigkeit umwandeln (etwa wie die folgende, aber der Wert ist nicht derselbe), OHNE Genauigkeit zu verlieren?


"0100 0000 0011 0111 1101 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010"

das ist die gleiche Nummer kodiert in IEEE-754 doppelter Genauigkeit.


Ich habe versucht, mit dem folgenden Algorithmus die erste Zeichenfolge zuerst wieder in eine Dezimalzahl umzuwandeln, aber sie verliert an Genauigkeit.


num in decimal = (sign) * (1 + frac * 2^(-23)) * 2^(exp - 127)

Ich verwende Qt C++ Framework auf der Windows-Plattform.


EDIT:Ich muss mich entschuldigen, vielleicht habe ich die Frage nicht klar formuliert.
Was ich meine ist, dass ich den wahren Wert 23,85 nicht kenne, ich habe nur die erste Zeichenfolge und ich möchte sie in doppelte Genauigkeit umwandeln Darstellung ohne Genauigkeitsverlust.


Antworten:


Nun:Behalten Sie das Vorzeichenbit bei, schreiben Sie den Exponenten neu (minus alter Bias, plus neuer Bias) und füllen Sie die Mantisse rechts mit Nullen auf...


(Wie @Mark sagt, müssen Sie einige Sonderfälle separat behandeln, nämlich wenn der voreingenommene Exponent entweder Null oder Maximum ist.)


Einige Code-Antworten


"0100 0001 1011 1110 1100 1100 1100 1100"  (approximately 23.85 in decimal) 
"0100 0000 0011 0111 1101 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010" 
num in decimal = (sign) * (1 + frac * 2^(-23)) * 2^(exp - 127)