我需要多大的缓冲区?
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 的注意)
对于存储在 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 的注意)