首页 > 解决方案 > 为什么 R 文档指出可能出现大于最大归一化浮点数的数字?

问题描述

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。请注意,可能会出现更大的非规范化数字

这是什么意思?更大的数字怎么会出现?

标签: rfloating-pointprecision

解决方案


编辑:下面更新,因为原始答案在技术上不正确(因为我没有在电脑上检查)。请跳过第一段回答。

如果您提供的数字太大,则数字将被四舍五入,但指数将在大致范围内。您没有提供完整长度的小数,但我们假设您提供了。如果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... 

推荐阅读