堆栈分配的字符串需要多大才能以%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
%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);