c - 找出sprintf中 "%f"格式的字段长度

标签 c floating-point c99 printf

在库的深处,我需要一个函数来分配一个字符串,将提供的 float 以 %f 格式写入字符串,然后返回它。 snprintf() 返回所需的字符数,这将允许我通过 2 个 snprintf() 调用分配正确的大小。不幸的是,这是一个对性能至关重要的部分,所以我想避免这种情况,因为 *printf() 可能会很慢(是的,在某些基准测试中它确实显示在配置文件上的#1)。

另一种方法是使用一些 C99 函数来解决这个问题,但 libm 调用也需要相当多的时间。我的函数的(非常简化,没有错误处理等)版本将如下所示


// Return a string containing number x in %f format with d digits after the decimal point.
char* my_function(double x, int d)
{
    int n = ceil(log10(pow(2, ilogb(x))));
    // 3 extra chars, the initial sign, the ".", and the terminating null.
    char *s = malloc(n + d + 3);
    snprintf(s, n + d+ 3, "%#-+.*f", d, x);
    return s;
}

一种可能更快的方法是分配一个“足够大”的字符串,然后仅在不太可能发生并且结果太短的情况下才执行第二个 snprintf 调用。

也可以构建代码,以便我可以使用 alloca() 和/或 C99 VLA 的堆栈分配,但由于堆栈空间通常非常有限,我希望避免在最坏的情况下消耗大量内存 -大小写缓冲区。

还有更好的主意吗?

最佳答案

您是否在内存受限的系统中运行?如果您还没有真正需要计算字节数,只需确定最坏的情况并将所有分配设置为这个大小即可。

另一种选择是让调用者提供缓冲区。

最后,您是否知道是否可以声明不需要同时存在超过有限数量的这些值?如果是这样,请为它们预先分配空间,并且不要在函数中执行 malloc() 。既然您说性能至关重要,那么您也应该尽量避免使用 malloc()。

关于c - 找出sprintf中 "%f"格式的字段长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9430415/

相关文章:

java - 数字与分数相乘

c - strtol 未检测到整数溢出

Crypt 返回哈希值还是摘要?

c - 自增和自减运算符

c++ - 结构的 cudaMalloc 和相同结构的元素

c++ - 使用新标准

C89 与 c99 GCC 编译器

c - 有哪些实现尾调用消除的好方法?

Swift:如何比较 CGFloat 小数点后的前 n 位数字?

floating-point - 如何在 SMT-LIB 标准中表示浮点常量(如 1e307)?