当我将无符号 8 位 int 转换为字符串时,我知道结果始终最多为 3 个字符(对于 255),而对于有符号 8 位 int,我们需要 4 个字符,例如“-128”。
现在我真正想知道的是浮点值也是一样的。将任何“双精度”或“浮点”值表示为字符串所需的最大字符数是多少?
假设常规 C/C++ 双精度 (IEEE 754) 和正常十进制扩展(即无 %e printf 格式)。
我什至不确定真正的小数字(即 0.234234)是否会比真正的大数字(代表整数的双精度数)长?
标准标头<float.h>
在 C 语言中,或者<cfloat>
在 C++ 中,包含几个与浮点类型的范围和其他度量有关的常量。其中之一是DBL_MAX_10_EXP
,代表所有所需的最大 10 次方指数double
价值观。自从1eN
needs N+1
表示的数字,并且可能还有负号,那么答案是
int max_digits = DBL_MAX_10_EXP + 2;
这假设指数大于表示最大可能尾数值所需的位数;否则,还会有一个小数点,后面跟着更多的数字。
更正
最长的数字实际上是可表示的最小负数:它需要足够的数字来覆盖指数和尾数。这个值是-pow(2, DBL_MIN_EXP - DBL_MANT_DIG)
, where DBL_MIN_EXP
是负数。很容易看出(并通过归纳法证明)-pow(2,-N)
needs 3+N
非科学十进制表示的字符 ("-0."
, 其次是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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)