【发布时间】:2019-05-23 09:48:31
【问题描述】:
在标准化双精度表示中,考虑“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 位双精度浮点表示?
【问题讨论】:
-
试试,
sprintf("%.8190f",9.68595); nchar(sprintf("%.8190f",9.68595))那么,8192 是否不包含相当于“10base 的 309 位指数”的“2base 的 X 位指数”? -
“2base 的 X 位指数”不是一个有意义的短语。
nchar(sprintf("%.8190f",9.68595))产生 8192,因为小数点前有一位,小数点后有一位,小数点后有 8190 位。如果将“9”更改为 90”,则需要 8193 个字符。 -
@EricPostpischil 确实很有帮助的评论,尤其是 9->90 8193 部分。我试过了,结果和你说的一样。
标签: r floating-point double limit notation