问题在于静态分配一个足够大的缓冲区,以适应最大精度使用%g格式化的双精度数。这似乎是一个简单的任务,但我遇到了麻烦。我想到的最好的解决方法(假设要打印的数字是x)是:
char buf[1 + DBL_DIG + DBL_DIG + 1 + 1 + 1 + DBL_DIG + 1];
int len = sprintf(buf, "%.*g", DBL_DIG, x);
DBL_DIG宏来自于 float.h,据说它指示了double类型的最大精度。我们需要:
- 1个字节用来存储符号
- 足够的字节来捕获有效数字
- 每个数字最多一个“分隔符”字符(逗号等)
- 1个字节用来存储小数点
- 1个字节用来存储'e'
- 1个字节用来存储指数符号
- 一些字节用来存储指数
- 1个字节用来存储sprintf写入的尾随null。
我使用有效数字的数量作为指数中数字数量的上限。我有任何错误吗?是否有更好的解决方案?我应该只分配64、128或256个字节并希望得到最好的结果吗?