代表任何双重值所需的字符的最大长度是多less?

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

现在我真正想知道的是浮点值是一样的。 什么是string表示任何“双”或“浮点”值所需的字符的最大数量是多less?

假设一个常规的C / C ++ double(IEEE 754)和正常的十进制扩展(即没有%e printf格式)。

我甚至不确定是否真的很小的数字(即0.234234)会比真正的巨大数字(双精度代表整数)长?

C中的标准头文件<float.h>或者C ++中的<cfloat>包含几个常量,用于处理浮点types的范围和其他度量。 其中之一就是DBL_MAX_10_EXP ,它是表示所有double值所需的最大功率指数。 由于1eN需要N+1数字来表示,并且可能有负号,那么答案是

 int max_digits = DBL_MAX_10_EXP + 2; 

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

更正

最长的数字实际上是最小的可表示的负数:它需要足够的数字来覆盖指数和尾数。 此值为-pow(2, DBL_MIN_EXP - DBL_MANT_DIG) ,其中DBL_MIN_EXP为负值。 对于非科学的十进制表示( "-0." ,其次是N位),- -pow(2,-N)需要3+N字符。 所以答案是

 int max_digits = 3 + DBL_MANT_DIG - DBL_MIN_EXP 

对于一个64位的IEEE双倍,我们有

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

http://en.wikipedia.org/wiki/IEEE_754-1985

最长的代表双倍:

-2.2250738585072020E-308

有24个字符。

你可以使用snprintf()来检查你需要多less个字符。 snprintf()返回打印任何传递给它的字符数。

 /* NOT TESTED */ #include <stdio.h> #include <stdlib.h> int main(void) { char dummy[1]; double value = 42.000042; /* or anything else */ int siz; char *representation; siz = snprintf(dummy, sizeof dummy, "%f", value); printf("exact length needed to represent 'value' " "(without the '\\0' terminator) is %d.\n", siz); representation = malloc(siz + 1); if (representation) { sprintf(representation, "%f", value); /* use `representation` */ free(representation); } else { /* no memory */ } return 0; } 

注意snprintf()是一个C99函数。 如果一个C89编译器提供它作为扩展,它可能不会做上面的程序期望的。

编辑 :改变链接到snprintf()到一个实际描述C99标准强加的function; 原始链接中的描述是错误的。
2013年:改变了链接回到 POSIX网站,我更喜欢在第一次编辑的网站 。

当通过设置精度将float / double转换为string时,您可以控制string表示中的数字位数。 最大数字位数将等于std::numeric_limits<double>::max()的string表示forms,并以您指定的精度执行。

 #include <iostream> #include <limits> #include <sstream> #include <iomanip> int main() { double x = std::numeric_limits<double>::max(); std::stringstream ss; ss << std::setprecision(10) << std::fixed << x; std::string double_as_string = ss.str(); std::cout << double_as_string.length() << std::endl; } 

所以,精度为10的double精度数字的最大数目是320个数字。

1024是不够的,最小的负双倍值有1077个十进制数字。 这里是一些Java代码。

 double x = Double.longBitsToDouble(0x8000000000000001L); BigDecimal bd = new BigDecimal(x); String s = bd.toPlainString(); System.out.println(s.length()); System.out.println(s); 

这是程序的输出。

 1077 -0. 

取决于你的意思是“代表”。 十进制小数没有精确的浮点表示。 当你转换十进制小数 – >二进制小数 – >十进制时,你没有精确的小数表示,并将在二进制表示结束时有噪声位。

问题不涉及从十进制开始,但是所有的源代码(并且必须是用户input)是十进制的,并且涉及可能的截断问题。 在这种情况下,“确切”意味着什么?

基本上,这取决于你的浮点表示。

如果你有48位的尾数,这需要大约16个十进制数字。 指数可能是剩余的14位(约5位十进制数字)。

经验法则是位数是小数位数的3倍。

“代表任何双重价值的字符的最大长度是多less?”

这个问题的确切答案是:8个ASCII字符 – hex格式,不包括'0x'前缀 – 100%的准确性:)(但它不只是一个笑话)

IEEE-754 double的可用精度约为16位十进制数字 – 因此排除教育目的,表示时间长于这些仅仅是浪费资源和计算能力:

  • 当用户在屏幕上看到一个700位数的号码时,他们没有得到更多的信息。

  • 以“更精确”的forms存储的configurationvariables是无用的 – 对这样的数字的每一个操作都会破坏准确性。 (不包括改变符号位)

如果有人需要更好的实际精度,那么有80位长的双精度,精度大约为18位,或者是非平衡的。

问候。