以下是两个片段:
a = 1:1000000; res = as.integer(0);
class(res)
system.time(for (e in a) res = res + e ^ 2)
class(res)
###########################
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
print (fn1(1000000))
底部片段来自此帖子: For-loop vs while loop in R
底部片段按预期工作,存在整数溢出,因为平方时的大数超过整数的边界。
然而,顶部片段产生了这个结果:
> a = 1:1000000; res = as.integer(0);
> class(res)
[1] "integer"
> system.time(for (e in a) res = res + e^2)
user system elapsed
0.411 0.001 0.412
> class(res)
[1] "numeric"
> print (res)
[1] 3.333338e+17
我的问题是:为什么res
改变为&#34;整数&#34;到&#34;数字&#34;?
答案 0 :(得分:2)
因为幂操作^
以双精度返回浮点数。
typeof( (2L) ^ 2 )
#[1] "double"
typeof( (2L) ^ (2L) )
#[1] "double"
如果您确实想在整数溢出实验中使用它,请使用
res = res + as.integer(e ^ 2)
lmo为您提供了R文档?"^"
(或?Arithmetic
):
如果两个参数都是整数类型,则/
和^
的结果类型是数字,而对于其他运算符,它是整数(溢出,发生在+/- (2^31 - 1)
,以NA_integer_
作为警告返回。