为啥 R 文档指出可能出现大于最大归一化浮点数的数字?
Posted
技术标签:
【中文标题】为啥 R 文档指出可能出现大于最大归一化浮点数的数字?【英文标题】:Why does the R documentation state that numbers larger than the largest normalized floating-point number can occur?为什么 R 文档指出可能出现大于最大归一化浮点数的数字? 【发布时间】:2021-06-19 19:46:26 【问题描述】:R 对双精度浮点数使用 IEEE 754 标准。根据我对这个标准的理解,虽然有非常小的次正规值可以填补下溢间隙,但对于较大的数字则没有这样的等价物。
我得到最大的浮点数如下:
.Machine$double.xmax
[1] 1.797693e+308
以十六进制打印以查看完整的二进制表示,我得到
sprintf("%+13.13a", .Machine$double.xmax)
[1] "+0x1.fffffffffffffp+1023"
现在,指数有它的最大可能值(我们有偏差指数 2046,偏差指数 2047 是为特殊情况保留的,即无穷大/NaN),有效数有它的最大可能值(所有 53 个二进制数字)是 1)。因此,我认为不能代表更大的数字。
但是 .Machine 的 R 文档(请参阅 https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/.Machine)为 double.xmax
声明了以下内容:
最大的归一化浮点数。通常,它等于
(1 - double.neg.eps) * double.base ^ double.max.exp
,但在某些机器上,它只是此类数字的第二或第三大,在有效数字的最后一位数字中太小了 1 或 2 个单位。通常为 1.797693e+308。 请注意,可能会出现更大的非标准化数字。
这是什么意思?怎么会出现更大的数字?
【问题讨论】:
【参考方案1】:编辑:更新如下,因为原始答案在技术上不正确(因为我没有在计算机上检查)。请跳过第一段回答。
如果您提供的数字太大,则数字将被四舍五入,但指数将在大致范围内。您没有提供完整长度的小数,但我们假设您提供了。如果1.797693e+308
是最大数字,那么1.797693999e+308
将缩写为1.797693e+308
。 R 不会失败,你会很困惑。但是你可能有一个更大的数字,比如58.88888999+310
,它可能会四舍五入到58.8888888+310
。您将需要使用为非常大的数字制作的包。这是因为最大指数是一个以 2 为底的数字(309 不是),并且您可以使用比有效数字更大的指数。
编辑:
.Machine$double.xmax
# [1] 1.797693e+308
format(.Machine$double.xmax, scientific = FALSE)
# [1] "179769313486231570838400602864442228000008602082842266064064680402680408280648240046204888888288080622822420842246006644866884860462806420066668022046626024066662068886808602862886866800048228686262462640668044406484606206082824406288200264266406808068464046840608044222802268424008466606886862062820068082688"
.Machine$double.xmax + 100
# [1] 1.797693e+308
format(.Machine$double.xmax + 100, scientific = FALSE)
# [1] "179769313486231570838400602864442228000008602082842266064064680402680408280648240046204888888288080622822420842246006644866884860462806420066668022046626024066662068886808602862886866800048228686262462640668044406484606206082824406288200264266406808068464046840608044222802268424008466606886862062820068082688"
(.Machine$double.xmax + 100) == (.Machine$double.xmax)
# [1] TRUE
# Problem that can rarely occur:
# index <- index + 1 # This will give the same answer for numbers that are too large...
【讨论】:
感谢您的回答,但我不确定我是否真的了解它与文档中的声明有何关系?您给出的两个数字都将在 R 中表示为Inf
。您的意思是文档指的是Inf
?
很好的标注。我正在用手机接听电话,但没有运行示例。我已经用一个例子编辑了答案。以上是关于为啥 R 文档指出可能出现大于最大归一化浮点数的数字?的主要内容,如果未能解决你的问题,请参考以下文章
postgreSQL使用sql归一化数据表的某列,以及出现“字段 ‘xxx’ 必须出现在 GROUP BY 子句中或者在聚合函数中”错误的可能原因之一