我需要多大的缓冲区?

时间:2015-01-16 07:55:36

标签: c printf c89

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

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

2 个答案:

答案 0 :(得分:5)

最糟糕的情况是:

  • 如果数字为负数
  • ,则减去-
  • 一个小数点.
  • DBL_DIG十进制数字
  • 指数部分不应大于e+999(*)
  • 终止null

因此缓冲区的大小应为DBL_DIG + 8

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

当然上面的内容只对符合IEEE754标准的浮点实现有意义(感谢Basile Starynkevitch注意)

答案 1 :(得分:0)

您最好使用snprintf代替sprintf;我猜以下可能(几乎总是)安全

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

或者只是char buf[48];

我很惊讶你在问。你为什么这么关心?

BTW,大多数C(但原则上不是全部)实现使用IEEE754。请参阅floating point guide