Double/float in String umwandeln

Double/float in String umwandeln


Ich muss eine Gleitkommazahl in eine äquivalente Zeichenfolge in Dezimalzahl (oder einer anderen Basis) umwandeln. Die Konvertierung muss zunächst im Format xE+0 erfolgen wobei x ist die Fließkommazahl.


Die Idee, die ich habe, ist, zuerst die Gleitkommazahl in eine temporäre Ganzzahl zu kürzen und diese Ganzzahl dann in eine Zeichenfolge umzuwandeln und dann den Bruchteil zu betrachten und ihn mit 10 zu multiplizieren während der Bruchteil nicht zu 0 wird . Nachdem der Bruchteil auf die linke Seite des Dezimalpunkts übertragen wurde, wenden Sie die Ganzzahl-auf-String-Funktion erneut an und konvertieren Sie den Bruchteil in einen String. Gibt es einen besseren Weg, der schneller sein wird als dieser? Wird diese Methode Nebenwirkungen hervorrufen?


Um die Gleitkommazahl in Exponentialdarstellung umzuwandeln, soll ich dasselbe wie oben tun und dann die Potenz anpassen? Oder bitmaskieren Sie direkt die IEEE 754-Gleitkommadarstellung und wandeln Sie jeden Teil in eine Zeichenfolge um.


Hinweis:Es konnten keine anderen Funktionen verwendet werden, da ich auf absolut keine Bibliotheksfunktionen Zugriff habe. Dieser Code geht in einen Spielzeugkern.


Antworten:


Die einzige exakte Lösung besteht darin, eine Dezimalarithmetik mit beliebiger Genauigkeit für die Basiskonvertierung durchzuführen, da der genaue Wert sehr sein kann lang - für 80-Bit long double , bis zu etwa 10000 Dezimalstellen. Glücklicherweise sind es "nur" bis etwa 700 Stellen oder so für IEEE double .


Anstatt mit einzelnen Dezimalziffern zu arbeiten, ist es hilfreich, stattdessen mit der Basis 1 Milliarde (der höchsten Potenz von 10, die in eine 32-Bit-Ganzzahl passt) zu arbeiten und dann diese „Ziffern zur Basis 1 Milliarde“ in jeweils 9 Dezimalziffern umzuwandeln am Ende Ihrer Berechnung.


Ich habe hier eine sehr dichte (ziemlich schwer zu lesende), aber effiziente Implementierung unter LGPL MIT-Lizenz:


http://git.musl-libc.org/cgit/musl/blob/src/stdio/vfprintf.c?h=v1.1.6


Wenn Sie die gesamte Hex-Float-Unterstützung entfernen, Infinity/Nan-Unterstützung, %g /%f /%e Variationsunterstützung, Rundung (die niemals benötigt wird, wenn Sie nur exakte Antworten wünschen) und andere Dinge, die Sie möglicherweise nicht benötigen, der restliche Code ist ziemlich einfach.