在C++中以高性能将double转换为char*

Sha*_*ala 25 c++ performance type-conversion

我的应用程序需要将double值转换为char*以写入仅接受字符的管道.通常的方法是使用sprintf()函数或使用iomanip.h头文件中的ostringstream.

事实证明,这两者都有非常糟糕的表现.我的应用程序需要经常进行此转换,以至于它成为主要的瓶颈.

我还可以使用其他功能吗?我可以使用什么逻辑来编写有效的转换函数?到目前为止,我唯一想到的就是使用除法和修改操作来获取每个数字,并将这些数字附加到char*以获得整个double值.这似乎不是一个好方法,并且本身可能会有糟糕的表现.

提前感谢您的想法.

编辑:关于如何使用char*存在一些混淆.char*将是写入管道的fwrite函数的参数.

nha*_*tdh 18

如果要打印双重类型可以支持的任何数字,请使用其中的任何库来完成工作.它可以节省您的理智:为什么"dtoa.c"包含如此多的代码?

如果要以双精度打印数字子集.例如,小数点后最多4位数,小数点前不超过5位数,那么你可以使用除法和mod打印出数字并转换为int类型.我可以确认这种方法的性能.


编辑: 如果你的原始目的是发送数据进行通信,那么发送二进制形式的double将是最快和最准确的方法(由于转换没有可能的精度损失).其他答案解释了这样做的方法.

  • 他想序列化double的内容.没有必要代表它. (7认同)

Cas*_*sey 9

您可以将std :: ostream write和std :: istream read方法与任何数据类型一起使用,只需将数据重新解释为一个char指针:

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));
Run Code Online (Sandbox Code Playgroud)


Saa*_*aad 7

如果你想逐字节读取数据.使用这种技术

double dbl = 2222;
char* ptr = (char*)(&dbl);
Run Code Online (Sandbox Code Playgroud)

这将返回dbl的最低字节.和ptr ++将引用dbl的第二个字节.

  • 这可能会受到小端/大端灵敏度的影响,但我同意尽可能避免转换. (3认同)
  • 它不是类型转换。问题是关于 double 的打印值。 (2认同)