在较长的脚本中,我必须将向量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))
。但是length
和nrow
产生的数字无论如何都必须是整数!此外,我使用函数is.integer ...
is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x-round(x)) < tol
......当然,他们是整数。那么为什么我需要拐杖“圆”呢?非常令人费解......有人知道背景中发生了什么?
答案 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 * 1456000
是numeric
,因为两个操作数实际上都是类numeric
。发生溢出是因为nrow
和length
都返回integer
,因此结果是整数,但结果超出了integer
类可表示的最大大小(+ / -2 * 10 ^ 9)。 numeric
或double
可以容纳2e-308 to 2e+308
。因此,要解决您的问题,只需使用as.numeric(length(A))
或as.double(length(A))
。