English 中文(简体)
使用高性能的 C+++ 将双倍转换为字符*
原标题:Converting double to char* in C++ with high performance

我的应用程序需要将双倍值转换为字符 * 以写入只接受字符的管道。 通常的做法是使用 < em> sprintf () 函数或使用 iomanip.h header 文件的 < em> ostringstream

结果发现,这两件东西的性能都很差。我的应用程序需要经常进行这种转换, 才能成为主要的瓶颈。

我还能用其他的函数吗?我可以用什么逻辑来写一个高效转换函数?到目前为止,我唯一能够想到的就是利用分部和模式操作把每个数字都拿出来,把这些数字附加到一个字符里,以获得全部的双重价值。 虽然这看起来不是个好方法,但也可能有不良的性能本身。

预先感谢你们的想法。

EDIT: 字符* 将如何使用有些混乱。 字符* 将是写给管道的fwrite 函数的论据 。

最佳回答

如果您想要打印任何可以支持的双型数字, 请使用任何图书馆来完成此项任务。 它保存您的理智 : < a href=> https:// stackoverflow. com/ questions/3173056/ why - does- dtoa- c- contain- so- much- code > 为何“ dtoa. c” 包含这么多代码?

如果您想要以双重类型打印数字子集。例如,在小数点之后最多4位数,在小数点之前不超过5位数,那么在使用分区和模式打印前,您可以将数字翻转并转换为输入键。我可以确认这种方法的性能。


EDIT: If you original purpose is to send the data for communication, then sending the binary form of double will be the fastest and most accurate method (no possible loss of precision due to conversion). The way to do this is explained in other answers.

问题回答

您可以使用标准d: 流 write 和标准d: 流 < code> read 方法, 使用任何数据类型来重新解释数据, 作为字符指针 :

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);

这将返回 dbl. ptr++ 中最低的字节, 而 ptr++ 将引用 dbl 第二 字节 。

你控制着管子的两端吗?

如果你只是挖隧道,管子是8位干净的, 那就使用上面的答案之一。

如果您需要字符串, 请使用上面的另外一个答案 。

如果您的问题是管子只有7位宽, 那么转换为< a href=' "https:// stackoverflow.com/ q/ 3424009/ 102025" >radix 64 写上或再读上。

有些系统提供 dstre dtostrf 转换功能 - 也许值得设定基准。 您可以查看 sprintf () 源代码( 如 GNU 版本), 获取 和/ 或 格式化, 避免格式字符串解释步骤, 甚至使其变得不可操作, 以及性能- 调味 - 如果您知道不需要处理, 您也许可以删除 NaN、 无限和其他值的特殊外壳 。

系统上 sprintf 的缓慢部分不一定是转换双倍,而是解析格式字符串。 这对于您可能是一个好消息, 因为这是您可以优化的东西 。

此外,尝试将您需要处理的 < code> 双 < /code> 值的范围、 准确性和性质的全部知识记录在文件上, 并用它来开发特殊算法 。

假设你的输入从来就不是超自然数字, 使用已知的固定精确度和精确度, 相对较高的性能效果可能看起来是这样:

itoa((int)((f + 0.00001) * 10000))

然而,您已经知道的 sprintf ostream 方法是唯一完全通用和可移动的解决方案。

/*

_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
", buf);

...

希望这能帮上忙

使用 ftoa 将略优于 sprintf ,因为这是它内部使用的方法。请参见 相关问题 < a href=" https://stackoverflow.com/ questions/23022969/how-to-profment-char-ftoafloat-num-nounse-sprintf-library-conf-form-i > > > >, 并查看您的库源是如何执行 ftoa 的, 并查看您能否根据您的具体方案加以改进 。

似乎ftoa 根本不是标准, 我的坏消息。 这里的< a href=> http://www.microchip.com/forums/m1837633.aspx> rel= “ nofollow noreferrer” > 讨论显示执行 < /a>, 它声称执行速度要快得多。 您需要同时在您自己的目标环境中进行描述, 用双倍而不是浮动执行 。

Concerning dtostre, there is also an extended version dtostren0(https://github.com/63n0m3/Stdlib_extension), where programmer can decide for how many decimal places the returned number is displayed in human friendly way(without e+n), the way normal humans would write. It still depends on original dtostre. Disclosure: I am an author.





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签