Konvertieren von double in char* in C++ mit hoher Leistung

Konvertieren von double in char* in C++ mit hoher Leistung


Meine Anwendung muss doppelte Werte in char* konvertieren, um in eine Pipe zu schreiben, die nur Zeichen akzeptiert. Die übliche Art, dies zu tun, ist die Verwendung von sprintf() Funktion oder mit ostringstream aus der Header-Datei iomanip.h.


Es stellt sich heraus, dass beide eine wirklich schlechte Leistung haben. Und meine Anwendung muss diese Konvertierung so oft durchführen, dass sie zum Hauptengpass wird.


Gibt es eine andere Funktion, die ich verwenden könnte? Welche Logik kann ich verwenden, um eine effiziente Konvertierungsfunktion zu schreiben? Das einzige, was mir bisher eingefallen ist, ist, jede einzelne Ziffer mit Divisions- und Mod-Operationen herauszubekommen und diese Ziffern an ein Zeichen* anzuhängen, um den gesamten Double-Wert zu erhalten. Dies scheint jedoch kein guter Ansatz zu sein und wird wahrscheinlich selbst eine schlechte Leistung haben.


Vielen Dank im Voraus für Ihre Meinung.


BEARBEITEN:Es gibt einige Verwirrung darüber, wie das Zeichen * verwendet wird. Das Zeichen* ist ein Argument für die fwrite-Funktion, die in eine Pipe schreibt.


Antworten:


Wenn Sie eine beliebige Zahl drucken möchten, die der doppelte Typ unterstützt, verwenden Sie eine beliebige Bibliothek, um die Aufgabe zu erledigen. Es rettet Ihren Verstand:Warum enthält "dtoa.c" so viel Code?


Wenn Sie eine Teilmenge von Zahlen in doppelter Schrift drucken möchten. Zum Beispiel bis zu 4 Stellen nach dem Dezimalpunkt und nicht mehr als 5 Stellen vor dem Dezimalpunkt, dann können Sie die Zahl runden und in den Typ Int konvertieren, bevor Sie sie mit Division und Mod ausdrucken. Ich kann die Leistung dieser Methode bestätigen.



BEARBEITEN:
Wenn Ihr ursprünglicher Zweck darin besteht, die Daten für die Kommunikation zu senden, dann ist das Senden der binären Form von Double die schnellste und genaueste Methode (kein möglicher Genauigkeitsverlust aufgrund von Konvertierung). Wie das geht, wird in anderen Antworten erklärt.


Einige Code-Antworten


double value = 5.0;
std::ostream os;
//... os.write(reinterpret_cast<const char*>(&value), sizeof(value));
//.. std::istream is;
is.read(reinterpret_cast<char*>(&value), sizeof(value));
double dbl = 2222;
char* ptr = (char*)(&dbl);
itoa((int)((f + 0.00001) * 10000)) 
/*  _ecvt_s Converts a double number to a string.  Syntax:  errno_t _ecvt_s(
char * _Buffer, size_t _SizeInBytes, double _Value, int _Count, int *_Dec, int *_Sign );
[out] _Buffer Filled with the pointer to the string of digits, the result of the conversion. [in] _SizeInBytes Size of the buffer in bytes. [in] _Value Number to be converted. [in] _Count Number of digits stored. [out] _Dec Stored decimal-point position. [out] _Sign Sign of the converted number. */ #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
... char *buf = (char*) malloc(_CVTBUFSIZE);
int decimal;
int sign;
int err;
err = _ecvt_s(buf, _CVTBUFSIZE, 1.2, 5, &decimal, &sign);
if (err != 0) { // implement error handling } else printf("Converted value: %s\n", buf);
...