我需要多大的缓冲区?

How large buffer do I need?

对于存储在 x 中的双精度值,buffer 在下面的函数调用中需要多大?

sprintf(buffer, "%.*g", DBL_DIG, x);

你最好使用 snprintf 而不是 sprintf ;我猜以下内容可能(几乎总是)安全

char buf[32+2*DBL_DIG];
snprintf(buf, sizeof(buf), "%.*g", DBL_DIG, x);

或者干脆 char buf[48];

我很惊讶你会问这个问题。你为什么这么在意?

顺便说一句,大多数 C(但原则上不是全部)实现使用 IEEE754. See the floating point guide.

最坏的情况是:

  • 一减 - if number if 负数
  • 一位小数.
  • DBL_DIG 十进制数字
  • 不应大于 e+999 的指数部分 (*)
  • 终止空值

所以缓冲区的大小应该是DBL_DIG + 8

(*) 根据 [IEEE 浮点数] 上的维基百科页面,双精度数的指数部分最多为 21023 < 10308.所以指数的十进制表示最多需要3位。

当然,以上内容仅对符合 IEEE754 的浮点实现有意义(感谢 Basile Starynkevitch 的注意)