表示任何双精度值所需的最大字符长度是多少?

新手上路,请多包涵

当我将无符号的 8 位 int 转换为字符串时,我知道结果将始终最多为 3 个字符(对于 255),而对于有符号的 8 位 int,我们需要 4 个字符,例如“-128”。

现在我真正想知道的是浮点值是一样的。将任何“double”或“float”值表示为字符串所需的最大字符数是多少?

假设一个常规的 C/C++ 双精度(IEEE 754)和常规的十进制扩展(即没有 %e printf-formatting)。

我什至不确定真正小的数字(即 0.234234)是否会比真正的大数字(表示整数的双精度数)更长?

原文由 martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 773
2 个回答

C 中的标准标头 <float.h> 或 C++ 中的 <cfloat> 包含几个与浮点类型的范围和其他指标有关的常量。其中之一是 DBL_MAX_10_EXP ,表示所有 double 值所需的最大 10 次幂指数。由于 1eN 需要 N+1 数字来表示,并且可能还有负号,那么答案是

int max_digits = DBL_MAX_10_EXP + 2;

这假设指数大于表示最大可能尾数值所需的位数;否则,也会有一个小数点后跟更多的数字。

更正

最长的数字实际上是最小的可表示负数:它需要足够的数字来覆盖指数和尾数。该值为 -pow(2, DBL_MIN_EXP - DBL_MANT_DIG) ,其中 DBL_MIN_EXP 为负数。 It’s fairly easy to see (and prove by induction) that -pow(2,-N) needs 3+N characters for a non-scientific decimal representation ( "-0." , followed by N 数字)。所以答案是

int max_digits = 3 + DBL_MANT_DIG - DBL_MIN_EXP

对于 64 位 IEEE double,我们有

DBL_MANT_DIG = 53
DBL_MIN_EXP = -1023
max_digits = 3 + 53 - (-1023) = 1079

原文由 Mike Seymour 发布,翻译遵循 CC BY-SA 2.5 许可协议

作为对基于 Greg A. Woods 准确评论公认答案 的改进,需要的更保守但仍然足够数量的字符是 3 + DBL_DIG + -DBL_MIN_10_EXP (总共 325 个),其中 3 个用于前导“-0”。这可能是需要的。如果使用 C 风格的字符串,请为 null ( '\0' ) 终止添加一个,以便可以使用以下命令创建足够大小的缓冲区(大小为 326):

 #include <limits.h>

char buffer[4 + DBL_DIG + -DBL_MIN_10_EXP];

对于那些更喜欢 C++ 数字限制接口 的人来说:

 #include <limits>

char buffer[4 + std::numeric_limits<double>::digits10 + -std::numeric_limits<double>::min_exponent10];

原文由 John Cummings 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题