8

在更长的脚本中,我必须将向量 A(2614)的长度与数据帧 B(1456000)的行数相乘。如果我直接这样做,length(A) * nrow(B)我会收到消息,NAs produced by integer overflow尽管当我乘以相同的数字时没有问题:

2614 * 1456000 
[1] 3805984000 

使乘法起作用的唯一方法是round(length(A)) * nrow(B)or length(A) * round(nrow(B))。但是由length和产生的数字nrow无论如何都必须是整数!此外,我使用函数 is.integer 的帮助页面上建议的以下函数对此进行了测试...

is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x-round(x)) < tol

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

4

1 回答 1

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是 anumeric因为两个操作数实际上都是 class numeric。发生溢出的原因是nrowlengthreturn integer,因此结果是整数,但结果超过了integer类可表示的最大大小 (+/-2*10^9)。一个numericdouble可以持有2e-308 to 2e+308。因此,要解决您的问题,只需使用as.numeric(length(A))or as.double(length(A))

于 2013-07-15T09:29:57.627 回答