我遇到了将float转换为字符串的问题,to_string
对我来说太慢了,因为我的数据可能涉及数百万的浮点数。
我已经在how to write those data out fast上找到了解决方案。
然而,在解决了这个问题后,我很快意识到将float转换为string会产生很大的影响。
那么,除了使用其他非标准库之外,还有其他任何想法或解决方案吗?
答案 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的各种实现与其他方法进行了比较:
而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