Ja können Sie die Konstruktion in Gleitkommaoperationen zerlegen so lange wie diese Vorgänge sind EXAKT und Sie können sich eine einzige endgültige ungenaue Betrieb.
Leider sind Gleitkommaoperationen bald ungenau werden, wenn Sie die Genauigkeit der Mantisse überschreiten, werden die Ergebnisse gerundet. Sobald ein Rundungsfehler auftritt, wird er bei weiteren Operationen kumuliert...
Also, ganz allgemein, NO Sie können einen solchen naiven Algorithmus nicht verwenden, um beliebige Dezimalzahlen zu konvertieren, da dies zu einer falsch gerundeten Zahl führen kann, die um mehrere ulp von der korrekten Zahl abweicht, wie andere Ihnen bereits gesagt haben.
ABER WIR WERDEN SEHEN, WIE WEIT WIR GEHEN KÖNNEN:
Wenn Sie den Wagen sorgfältig rekonstruieren, sieht das so aus:
if(biasedExponent >= 0)
return integerMantissa * (10^biasedExponent);
else
return integerMantissa / (10^(-biasedExponent));
es besteht die Gefahr, die Genauigkeit zu überschreiten, sowohl bei der Kumulierung der GanzzahlMantissa, wenn sie viele Stellen hat, als auch bei der Erhöhung von 10 hoch biasedExponent...
Wenn die ersten beiden Operationen exakt sind, kann man sich glücklicherweise eine letzte ungenaue Operation * oder / leisten, denn dank der IEEE-Eigenschaften wird das Ergebnis korrekt gerundet.
Wenden wir dies auf einfache Präzisions-Gleitkommazahlen an, die eine Genauigkeit von 24 Bit haben.
10^8 > 2^24 > 10^7
Da das Vielfache von 2 nur den Exponenten erhöht und die Mantisse unverändert lässt, müssen wir uns bei der Potenzierung von 10 nur mit Potenzen von 5 befassen:
5^11 > 2^24 > 5^10
Sie können sich jedoch eine Genauigkeit von 7 Ziffern in der integerMantissa und einen verzerrten Exponenten zwischen -10 und 10 leisten.
In doppelter Genauigkeit, 53 Bits,
10^16 > 2^53 > 10^15
5^23 > 2^53 > 5^22
Sie können sich also 15 Dezimalstellen und einen verzerrten Exponenten zwischen -22 und 22 leisten.
Es liegt an Ihnen zu sehen, ob Ihre Zahlen immer in den richtigen Bereich fallen... (Wenn Sie wirklich trickreich sind, können Sie Mantisse und Exponent durch Einfügen/Entfernen von Nullen am Ende ausgleichen).
Andernfalls müssen Sie eine erweiterte Präzision verwenden.
Wenn Ihre Sprache Integer mit beliebiger Genauigkeit anbietet, dann ist es ein bisschen knifflig, es richtig zu machen, aber nicht so schwierig, ich habe das in Smalltalk gemacht und darüber gebloggt unter http://smallissimo.blogspot.fr/2011/09/clarifying-and-optimizing.html y http://smallissimo.blogspot.fr/2011/09/reviewing-fraction-asfloat.html
Beachten Sie, dass dies einfache und naive Implementierungen sind. Glücklicherweise ist die libc besser optimiert.