为啥 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 文档指出可能出现大于最大归一化浮点数的数字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要softmax函数?为啥不简单归一化?

Numpy 在计算归一化马氏距离时指出该无效值

熊猫数据帧的分位数归一化

文档的朴素贝叶斯分类器中的长度归一化

postgreSQL使用sql归一化数据表的某列,以及出现“字段 ‘xxx’ 必须出现在 GROUP BY 子句中或者在聚合函数中”错误的可能原因之一

直线上的最大点数 O(N)