堆栈分配的字符串需要多大才能以%g格式存储任何浮点数/双精度数?

int main()
{
    float f;
    double d;
    
    char f_str[ ?? ];
    char d_str[ ?? ];
    
    sprintf(f_str, "%g",  f);
    sprintf(d_str, "%lg", d);
}

编辑:

我希望在编译时知道字符串大小,这样我就不依赖堆分配或VLA

推荐答案

%g浮点表示的最大字符串长度是多少?

13当值在10+/-999内时

15加binary128


对于极值"%g",使用指数表示法.

缺少width或精度的"%g"将打印为6个有效数字.

期待已久的格式:

[sign][digit].[5 digits]e[sign][expo_digits]
   1     1   1    5     1   1       3        --> 13

示例:

//           1234567890123
DBL_TRUE_MIN -4.94066e-324

  • double的指数范围较大时,需要额外的空间.

  • 南可能会打印一些更长的东西.很多事情都是由实现定义的.合理的最坏情况形式会将其估计为"-SNaN"decimal payload"binary64的有效负载可能是16位小数.


堆栈分配的字符串需要多大才能以%g格式存储任何浮点数/双精度数?

如果求值为constant,给定指数范围(以十进制表示)可能超过3位,并且NaN可能会打印有效负载,我会按比例打印NaN有效负载,因为这肯定是最糟糕的情况.使用以位为单位的有效位大小通过按log10(2)进行zoom 来确定小数有效负载.

#define DBL_SIZE (sizeof(double)*CHAR_BIT)
#define LOG10_2_NUM 302
#define LOG10_2_DEN 1000
#define DBL_PAYLOAD (DBL_MANT_DIG*LOG10_2_NUM/LOG10_2_DEN)
#define DBL_G_SIZE (5 /* -sNAN */ + DBL_PAYLOAD + 1 /* \0 */ )

因此,公共double的缓冲区大小为22.


考虑到所有可能的实现定义属性,我将使用snprintf().

 char buf[DBL_G_SIZE];
 int len = snprintf(buf, sizeof buf, "%g", x);
 assert(len > 0 && (unsigned) len < sizeof buf);

C++相关问答推荐

是否可以在C中进行D3 D12申请?

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

为什么这个C程序代码会产生以下结果?

C指针地址和转换

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

如何将不同长度的位转换成字节数组?

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

SDL 2.0-从数组渲染纹理

ESP32在vTaskDelay上崩溃

有没有可能我不能打印?(C,流程)

在编写代码时,Clion比vscode有更多的问题指示器

链接到底是如何工作的,我在这里到底做错了什么

Zlib:解压缩大文件导致";无效代码长度设置";错误

OSDev--双缓冲重启系统

如何对现有的双向循环链表进行排序?

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

在哪里可以找到叮当返回码的含义?

free后内存泄漏?

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

如何确定 C 程序中的可用堆内存