为什么 sprintf("%.8190f", .Machine$double.xmax) 或 sprintf("%.8190f", (2-2^(-52))*2^1023) 所需的结果字符串长度相等到 8500?

Why does the required resulting string length for sprintf("%.8190f", .Machine$double.xmax) or sprintf("%.8190f", (2-2^(-52))*2^1023) equal to 8500?

在规范化双精度表示中,认为是“1”。小数部分的“1.f”导致我们将 sprintf 最大值从 8192 减少到 8190。

现在;

identical(.Machine$double.xmax, (2-2^(-52))*2^1023) # TRUE

sprintf("%.8190f", .Machine$double.xmax)
# Error in sprintf("%.8190f", .Machine$double.xmax) : required resulting string length 8500 is greater than maximal 8192

sprintf("%.8190f", (2-2^(-52))*2^1023)
# Error in sprintf("%.8190f", (2 - 2^(-52)) * 2^1023) : required resulting string length 8500 is greater than maximal 8192

sprintf("%.8190f", .Machine$double.xmax- 10^308)
# Error in sprintf("%.8190f", .Machine$double.xmax - 10^308) : required resulting string length 8499 is greater than maximal 8192

sprintf("%.7882f", -.Machine$double.xmax) 
# Error in sprintf("%.7882f", -.Machine$double.xmax) : required resulting string length 8193 is greater than maximal 8192
sprintf("%.7881f", -.Machine$double.xmax) # Seamlessly shows the result.

(2-2^(-52) ) 2^1023 ≈ 1,797693 x 10^308。那么,这个8500在什么地方 sprintf 输出实现自?

此外,sprintf 的值是:长度为最长输入的字符向量。如果 fmt 的任何元素或任何字符参数声明为 UTF-8,则结果的元素将采用 UTF-8,并且编码声明为 UTF-8。否则它将使用当前语言环境的编码。

所以,sprintf似乎不是给出数值的64位双精度浮点表示?

%.nf”格式在需要时产生负号,打印数字的整数小数位,句点,以及 n 指定的小数位数。因此,对于 1.797693•10308 附近的最大可表示有限值,%.8190f 将产生 309 位数字、一位小数点和小数点后的 8,190 个零,总共 8,500 个字符。

作为确认,观察nchar(sprintf("%.100f", .Machine$double.xmax))的结果是410,共309位,一位小数,小数点后100个0。