最快的C ++方法将float转换为字符串

时间:2015-04-21 08:39:08

标签: c++ c++11 floating-point formatting

我遇到了将float转换为字符串的问题,to_string对我来说太慢了,因为我的数据可能涉及数百万的浮点数。

我已经在how to write those data out fast上找到了解决方案。

然而,在解决了这个问题后,我很快意识到将float转换为string会产生很大的影响。

那么,除了使用其他非标准库之外,还有其他任何想法或解决方案吗?

2 个答案:

答案 0 :(得分:1)

要记住的优化是不直接使用to_string,每次调用它时都会创建一个新字符串。 您可能最终也会复制该字符串,这样效率不高。

你可以做的是分配一个足够大的char缓冲区来存储你需要的所有字符串表示,然后使用printf

http://www.cplusplus.com/reference/cstdio/printf/

始终重复使用相同的缓冲区。 如果将浮点数的精度限制为固定的小数位数,则可以计算浮点数在数组中的偏移量。

例如,如果我们只有一个值数组:

index = 1;
float f = value[index];
//corrresponding 6 chars float
const char* s = char_array[index*1];
//the representation will start at position 6, and it will be null terminated so you can use it as a string

为了澄清您的char_array将如下所示:

1.2000\02.4324\0...

答案 1 :(得分:1)

据我所知,将浮点转换为十进制字符串表示形式的最快算法是Florian Loitsch的Grisu(Printing Floating-Point Numbers Quickly and Accurately with Integers)和Ulf Adams的Ryū(Ryū: fast float-to-string conversion)。

Milo Yip的

dtoa-benchmark将Grisu的各种实现与其他方法进行了比较:

enter image description here

https://github.com/ulfjack/ryu具有Ryū算法的一些基准。

The {fmt} library实现了Grisu的一种变体,并提供了高级格式化API,既安全又有效,避免了必要时避免动态内存分配:

fmt::memory_buffer buf;
std::format_to(buf, "{}", 4.2);
// buf.data() returns a pointer to the formatted data and buf.size() gives the size