为了以 %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 格式存储任何浮点数/双精度数,堆栈分配的字符串需要有多大?
int main()
{
float f;
double d;
char f_str[ ?? ];
char d_str[ ?? ];
sprintf(f_str, "%g", f);
sprintf(d_str, "%lg", d);
}
编辑:
我希望在编译时知道字符串大小,这样我就不会依赖堆分配或 VLA
您可以使用snprintf()计算特定格式字符串和值所需的确切长度
这取决于实际的浮点格式和当前区域设置,因为某些字符(例如小数点字符)可能需要几个字节。例如,如果
double
对应于 IEEE 754 二进制 64 格式(又名双精度),则在 C 语言环境下最大字符串长度(字节数)为 13,但实际上可能是 14(我什至不认为C 标准有限制)。例子:
在我的 Debian Linux 机器(启用了所有语言环境)上,我得到:
14 是由于 ps_AF 区域设置(基于 UTF-8)中用于小数点字符的 U+066B 阿拉伯十进制分隔符所致,编码为 D9 AB。
答案与 类似
long double
,但您需要知道关联格式的最小和最大指数。当值在 10 +/- 999范围内时为 13
15 与二进制 128
对于极值
"%g"
,使用指数表示法。"%g"
,缺少宽度或精度,将打印 6 位有效数字。长期预期的形式:
例子:
当
double
指数范围更宽时,需要额外的空间。NAN 可能会打印更长的内容。很多是由实现定义的。合理的最坏情况形式将其估计为“-sNAN”十进制有效负载“ binary64的有效负载可能是 16 位小数。
如果寻找一个常量,给定指数范围(十进制)可能超过 3 位数字,并且 NAN 可以打印有效负载,我会在 NAN 有效负载打印上进行扩展,因为这肯定是最坏的情况。使用以位为单位的有效数字大小,通过 log10(2) 缩放来确定十进制有效负载。
因此,common 的缓冲区大小为 22
double
。考虑到所有潜在的实现定义属性,我会使用
snprintf()
.