R:简单乘法导致整数溢出

时间:2013-07-15 09:24:45

标签: r integer-overflow

在较长的脚本中,我必须将向量A(2614)的长度乘以数据帧B的行数(1456000)。如果我直接使用length(A) * nrow(B)执行此操作,我会收到消息NAs produced by integer overflow,但是当我乘以相同的数字时没有问题:

2614 * 1456000 
[1] 3805984000 

使乘法运算的唯一方法是round(length(A)) * nrow(B)length(A) * round(nrow(B))。但是lengthnrow产生的数字无论如何都必须是整数!此外,我使用函数is.integer ...

的帮助页面上建议的以下函数对此进行了测试
is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x-round(x)) < tol

......当然,他们是整数。那么为什么我需要拐杖“圆”呢?非常令人费解......有人知道背景中发生了什么?

1 个答案:

答案 0 :(得分:13)

希望以图形方式表示正在发生的事情......

2614 * 1456000
#[1] 3805984000

##  Integers are actually represented as doubles
class( 2614 * 1456000 )
#[1] "numeric"

#  Force numbers to be integers
2614L * 1456000L
#[1] NA
#Warning message:
#In 2614L * 1456000L : NAs produced by integer overflow

##  And the result is an integer with overflow warning
class( 2614L * 1456000L )
#[1] "integer"
#Warning message:
#In 2614L * 1456000L : NAs produced by integer overflow

2614 * 1456000numeric,因为两个操作数实际上都是类numeric。发生溢出是因为nrowlength都返回integer,因此结果是整数,但结果超出了integer类可表示的最大大小(+ / -2 * 10 ^ 9)。 numericdouble可以容纳2e-308 to 2e+308。因此,要解决您的问题,只需使用as.numeric(length(A))as.double(length(A))