【问题标题】:Why does `a ^ b` return a numeric when both `a` and `b` are integers?当`a`和`b`都是整数时,为什么`a ^ b`返回一个数字?
【发布时间】:2013-05-29 01:46:39
【问题描述】:

给定两个整数:

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 &lt;- 2Lb &lt;- 3L)会返回一个数字,所以更一般的做法总是返回一个数字.

现在开始求幂:

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

这对我来说有点意外。谁能解释一下为什么要这样设计?

【问题讨论】:

  • 我猜是因为结果会导致Inf?? as.integer(Inf) 将导致 NA。例如:2L ^ 10000L
  • 虽然我喜欢所选的答案,但也许有人会问,让实际的求幂代码创建另一个“极端情况”是否有任何优势。尤其是如果R 代码或unix pow 可以调用的函数首先使用日志来计算指数。

标签: r integer exponent


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    ^ 视为函数族f(a)(b) = a^b。对于a=2,它返回整数的域被限制为值 [0,62](假设 64 位有符号整数)。这是有效输入的一个非常小的子集。域只会随着a 的增加而变小。

    【讨论】:

    • 有趣。我想我更喜欢 Rob Lyndon 的回答(“整数在 ^ 操作下 [数学上] 没有关闭”),但你的答案是合理的(“整数在 ^ 操作下 [计算上] 没有关闭”) - - 但这变得很棘手,因为人们必须开始决定糊状/务实的理由......
    【解决方案3】:

    它对两个整数进行简单的加减乘乘得到整数。在除法或执行幂运算时会产生带/不带小数的数字,这就是为什么显示数字而不是整数的原因。

    【讨论】:

      【解决方案4】:

      有没有可能a^b 被实现为exp(b * log(a)) 之类的东西?

      【讨论】:

      • 没有证据,这种言论最好留作评论。
      • 奇怪的是 :-) 这是我不久前的评论。我应该更加积极主动,去看看基础源代码。
      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 2014-01-15
      • 2019-08-07
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2021-10-06
      • 2010-12-08
      相关资源
      最近更新 更多