R中的整数溢出是什么?它怎么会发生?

Mat*_*ert 34 integer r numeric overflow

我有一些计算正在进行并得到以下警告(即没有错误):

Warning messages:
1: In sum(myvar, na.rm = T) :
Integer overflow - use sum(as.numeric(.))
Run Code Online (Sandbox Code Playgroud)

在这个线程中,人们声明整数溢出根本不会发生.要么R不是过于现代,要么是不对.但是,我应该在这做什么?如果我使用as.numeric警告暗示我可能不会解释信息丢失的事实.myvar从.csv文件中读取,所以不应该知道需要更大的字段吗?它已经切断了什么吗?

什么是的最大长度integer或者numeric?你会建议任何其他字段类型/模式吗?

编辑:我跑:

R版本2.13.2(2011-09-30)平台:R Studio中的x86_64-apple-darwin9.8.0/x86_64(64位)

42-*_*42- 40

您可以通过阅读帮助页面回答许多问题?integer.它说:

R对整数向量使用32位整数,因此可表示整数的范围限制为约+/- 2*10 ^ 9.

R Core正在考虑扩展到更大的整数,但它不会在不久的将来发生.

如果你想要一个"bignum"容量,那么安装Martin Maechler的Rmpfr包 [PDF].由于其作者的声誉,我推荐'Rmpfr'包.Martin Maechler也积极参与Matrix包开发,也在R Core中.还有其他选择,包括算术包,如'gmp','Brobdingnag'和'Ryacas'包(后者还提供符号数学界面).

接下来,要回答您链接到的答案中的批评性评论,以及如何评估与您的工作的相关性,请考虑以下事项:如果R中有一种"现代"语言可用的统计功能相同,您可能会看到该方向的用户迁移.但我要说的是,此时的迁移,当然还有增长,都处于R方向.R由统计人员建立,用于统计.

曾经有一个带有统计软件包的Lisp变种Xlisp-Stat,但它的主要开发者和支持者现在是R-Core的成员.另一方面,最早的R开发人员之一Ross Ihaka 建议使用类似Lisp的语言开发 [PDF].有一种名为Clojure的编译语言(发音为英语使用者称为"闭包"),带有实验界面,Rincanter.

更新:

新版本的R(3.0.+)具有53位整数(使用numeric尾数).当为"整数"向量元素分配超过'.Machine $ integer.max'的值时,整个向量被强制为"数字",即"双".integers遗骸的最大值,但是,可能会强制整数向量加倍,以保持以前产生溢出的情况下的准确性.不幸的是,列表,矩阵和数组维度以及向量的长度仍设置为integer.max.

从文件中读取大值时,使用字符类作为目标然后进行操作可能更安全.如果对NA值有强制,则会发出警告.


NPE*_*NPE 22

简而言之,integer是具有有限范围的精确类型,并且numeric是浮点类型,其可以表示更宽范围的值但是不精确.有关更多详细信息,请参阅帮助页面(?integer?numeric).

至于溢出,这是Brian D. Ripley 的解释:

这意味着你正在采用[在你的情况下,一些非常大的整数的总和 - @aix]的平均值,并且计算是溢出的.这只是一个警告.

这不会发生在R的下一个版本中.

您可以通过给出后缀来指定数字是整数L,例如,1L是一个整数,而不是1带有类的浮点数"numeric".

您可以在计算机上创建的最大整数由.Machine$integer.max.

> .Machine$integer.max
[1] 2147483647
> class(.Machine$integer.max)
[1] "integer"
Run Code Online (Sandbox Code Playgroud)

向此添加正整数会导致溢出,返回NA.

> .Machine$integer.max + 1L
[1] NA
Warning message:
In .Machine$integer.max + 1L : NAs produced by integer overflow
> class(.Machine$integer.max + 1L)
[1] "integer"
Run Code Online (Sandbox Code Playgroud)

您可以通过添加浮点值来绕过此限制.

> .Machine$integer.max + 1
[1] 2147483648
> class(.Machine$integer.max + 1)
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)

因为在您的情况下发出警告sum,这表示当数字加在一起时发生溢出.建议的解决方法sum(as.numeric(.))应该可以解决问题.


Ric*_*ton 5

整数或数字的最大长度是多少?

向量当前使用整数索引,因此最大长度由 给出.Machine$integer.max。正如 DWin 所指出的,目前 R 的所有版本都使用 32 位整数,因此这将是2^31 - 1或略高于 20 亿。

除非您正在打包一些重要的硬件(或者您将来正在阅读本文;2012 年的问候),否则您将没有足够的内存来分配那么长的向量。

我记得在一次讨论中,R-core(我认为是 Brian Ripley)建议下一步可能是用双精度数的尾数来索引向量,或者类似的聪明的东西,有效地给出 48 位索引。遗憾的是,我找不到该讨论。


除了该Rmpfr软件包之外,如果您遇到整数溢出问题,您可能还想尝试该int64软件包。