任何双精度浮点数所需的最大字符长度是多少?

71
当我将无符号8位整数转换为字符串时,我知道结果最多只有3个字符(对于255),而对于有符号的8位整数,例如“-128”,我们需要4个字符。
现在我真正想知道的是浮点数值的相同情况。要将任何“double”或“float”值表示为字符串所需的最大字符数是多少?
假设使用常规C/C++ double(IEEE 754)和常规十进制展开(即没有%e printf-formatting)。
我甚至不确定非常小的数字(即0.234234)是否会比表示整数的双倍更长?

7
Jalf,为什么有人会提到那个?谁说他在问固定大小的缓冲区需要多大?也许他想知道在基于文本的表格中他需要在控制台上预留多少字符列。 - Rob Kennedy
没有科学计数法,对于数量级范围极端的值来说,它将变得很长,但这有什么意义呢?谁会读这样一个数字——一个双精度浮点数(通常)具有大约15个有效十进制数字——其余的将是大量的前导零或尾随零。 - Clifford
1
不,你可以有比15个有效数字更多的小数位,但整数只能有15个有效数字。这是因为虽然你可以表示所有整数,但不能表示所有十进制扩展,所以可以使用较少的位来覆盖更大的范围。 - martin
我不是为了让人们阅读而打印数字,我正在尝试找到所需的字符缓冲区大小,以确保 strtod 的反转(即 "dtoa(double d, char* output)") 可以安全地完成,没有缓冲区溢出的风险。 - martin
@matrin,我尝试使用for循环并将数字乘以它直到得到1.#INF00,最大的数字长度为286字节。所以我猜你用512字节应该没问题吧?(使用printf)。 - Rookie
@jalf 问题在于我不知道如何使用标准的 printf 格式来格式化 std::string。所以如果我得到一个双精度浮点数,我需要创建一个 char[X] 缓冲区。 - Tomáš Zato
12个回答

0

"为此,您需要确切的325个字符"

显然(这是一个非常普遍的情况),您不了解不同数字进制之间的转换方式。

无论DBL_MIN的定义有多准确,它都受到硬件精度的限制,通常高达80位或18个十进制数字(x86和类似架构)

因此,专门的任意精度算术库已经被发明出来,例如gmp或mpfr。


0
你应该将浮点数表示为十进制或者使用e记法中最短的形式,精确到小数点后17位(就像printf("%.17g\n", -1.2345);一样,Python也是这样做的),那么答案就是24个字符(加上一个尾随的空字符)。
-2.2250738585072014e-308

如果您以17位小数的精度打印该值,答案是343个字符(+1个空字符)。
-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049406564584124654

如果您打印十进制的确切值(例如使用this C code),那么答案是1077个字符(加上一个空字符):

-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接