进入时1e9999999999999999999999999999999
进入 R 时,R 挂起并且不会响应 - 需要将其终止。
这似乎发生在 3 台不同的计算机、操作系统(Windows 7 和 Ubuntu)上。它发生在 RStudio、RGUI 和 RScript 中。
下面是一些可以更轻松地生成数字的代码:
boom <- paste(c("1e", rep(9, 31)), collapse="")
eval(parse(text=boom))
现在显然这不是一个实际问题。我不需要使用这么大的数字。这只是好奇心的问题。
奇怪的是,如果你尝试1e9999999999999999999999999999998
or 1e10000000000000000000000000000000
(幂加或减一),你得到Inf
and 0
分别。这个数字显然是某种界限,但是什么和为什么在这里呢?
我认为可能是:
- 浮点问题,但我认为它们的最大值为 1.7977e308,远远早于所讨论的数字。
- 32 位整数的问题,但 2^32 是 4294967296,比有问题的数字小得多。
- 真奇怪。这是我的主导理论。
编辑:最迟截至 2015 年 9 月 15 日,这不再导致 R 挂起。他们一定已经修补了它。
这看起来像是解析器中的一个极端情况。这XeY
格式描述于第 10.3.1 节:文字常量 http://cran.r-project.org/doc/manuals/R-lang.html#Literal-constants of the R语言定义 http://cran.r-project.org/doc/manuals/R-lang.html并指向?NumericConstants
获取“当前接受格式的最新信息”。
问题似乎是解析器如何处理指数。数字常量由以下方式处理NumericValue
(第 4361 行main/gram.c
),它调用mkFloat
(第 4124 行main/gram.c
),它调用R_atof
(第 1584 行main/util.c
),它调用R_strtod4
(第 1461 行main/util.c
)。 (所有内容自修订版 60052 起。)
第 1464 行main/utils.c
shows expn
声明为int
如果指数太大就会在第1551行溢出。有符号整数溢出会导致未定义的行为。
例如,下面的代码生成指数 Inf对于指数 > 308。
const <- paste0("1e",2^(1:31)-2)
for(n in const) print(eval(parse(text=n)))
您可以看到指数 > 2^31 的未定义行为(R 在指数 = 2^31 时挂起):
const <- paste0("1e",2^(31:61)+1)
for(n in const) print(eval(parse(text=n)))
我怀疑这会引起 R-core 的任何关注,因为 R 只能存储大约 2e-308 到 2e+308 之间的数值(请参阅?double
)这个数字是way除此之外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)