为什么 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。
在规范化双精度表示中,认为是“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。