【问题标题】:Why does the required resulting string length for sprintf("%.8190f", .Machine$double.xmax) or sprintf("%.8190f", (2-2^(-52))*2^1023) equal to 8500?为什么 sprintf("%.8190f", .Machine$double.xmax) 或 sprintf("%.8190f", (2-2^(-52))*2^1023) 所需的结果字符串长度等于 8500 ?
【发布时间】: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


【解决方案1】:

如果需要,“%.nf”格式会产生一个负号、正在打印的数字的整数十进制数字、句点和由 n。因此,对于 1.797693•10308 附近的最大可表示有限值,%.8190f 将产生 309 位数字、一位小数点和 8,190 个小数点后的零,总计 8,500 个字符。

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

【讨论】:

  • 非常感谢埃里克!你真的很好地观察到了正在发生的事情。
猜你喜欢
  • 2021-10-31
  • 2016-07-29
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2014-07-04
  • 2017-01-14
  • 2022-04-12
  • 1970-01-01
相关资源
最近更新 更多