2013-06-02 64 views
14

给定两个整数:为什么`a^b`在`a`和`b`都是整数时返回一个数字?

a <- 1L 
b <- 1L 

正如我所料,加,减,或者他们也乘以给出了一个整数:

class(a + b) 
# [1] "integer" 
class(a - b) 
# [1] "integer" 
class(a * b) 
# [1] "integer" 

但将他们给出了一个数字:

class(a/b) 
# [1] "numeric" 

我想我可以理解为什么:因为其他整数组合(例如a <- 2Lb <- 3L)会返回数字,它总是需要做的事情总是返回一个数字。

现在到幂:

class(a^b) 
# [1] "numeric" 

这个人是有点让我吃惊的。任何人都可以解释为什么它是这样设计的?

+2

我想这是因为结果会导致'Inf'? 'as.integer(Inf)'会导致'NA'。例如:2L^10000L – Arun

+1

尽管我喜欢所选的答案,但也许有人会问,让实幂的代码创建另一个“角落案例”是否有任何优势。特别是如果可以调用的'R'代码或'unix'' pow函数首先使用日志来计算指数。 –

回答

17

这涵盖了指数为负数的情况。

6

考虑^作为功能家族,f(a)(b) = a^b。对于a=2,返回整数的域限制为值[0,62](假定为64位有符号整数)。这是有效输入的一小部分。域名只会变小,因为a增加。

+0

有趣。我认为我更喜欢Rob Lyndon的回答(“在[^'操作”下,整数不是[数学]),但是你的理由是合理的(“整数在[^'操作”下不是[计算] - 但这会变得棘手,因为人们必须开始决定糊涂/务实的理由...... –

0

它简单的加,减,乘两个整数产生整数。而分数或执行幂运算的结果是带/不带小数的数字,为什么要显示数字而不是整数。

+0

这就是接受的答案已经说过的...... – flodel

0

是否有可能a^b被实施为类似exp(b * log(a))的东西?

+1

没有证据,这种评论最好留下来作为评论imo。 –

+0

奇怪的是:-)这是我刚才的评论。我应该更积极主动地去看一下基本的源代码。 –

相关问题