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(.))
应该可以解决问题.
整数或数字的最大长度是多少?
向量当前使用整数索引,因此最大长度由 给出.Machine$integer.max
。正如 DWin 所指出的,目前 R 的所有版本都使用 32 位整数,因此这将是2^31 - 1
或略高于 20 亿。
除非您正在打包一些重要的硬件(或者您将来正在阅读本文;2012 年的问候),否则您将没有足够的内存来分配那么长的向量。
我记得在一次讨论中,R-core(我认为是 Brian Ripley)建议下一步可能是用双精度数的尾数来索引向量,或者类似的聪明的东西,有效地给出 48 位索引。遗憾的是,我找不到该讨论。
除了该Rmpfr
软件包之外,如果您遇到整数溢出问题,您可能还想尝试该int64
软件包。