r - 为什么 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。请注意,可能会出现更大的非规范化数字。
这是什么意思?更大的数字怎么会出现?
解决方案
编辑:下面更新,因为原始答案在技术上不正确(因为我没有在电脑上检查)。请跳过第一段回答。
如果您提供的数字太大,则数字将被四舍五入,但指数将在大致范围内。您没有提供完整长度的小数,但我们假设您提供了。如果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...
推荐阅读
- javascript - 如何在没有 sumbit 的情况下设置会话输入?
- swiftui - 跟踪已发布项目列表的状态变量
- c++ - 在线程 A 中创建 std::thread 对象,加入线程 B
- java - 在 RxJava 中将对象的 Single 转换为同一对象的内部字段的 Single
- c# - 向 ICommand (C# WPF) 添加新方法
- javascript - 选择特定的 div 以使用 eventListener 设置属性
- html - 改变 UL 内 LI 项目之间的距离:“行高”方法不起作用
- r - 将日期聚合为 R 中的日期间隔/期间
- java - Android 中的段落和项目符号
- c - 为什么我不能在这段代码中用 C 分配数组元素后立即打印它?