【问题标题】:weird NaN when raising a number to a non-integer power [duplicate]将数字提高到非整数幂时出现奇怪的 NaN [重复]
【发布时间】:2015-12-27 03:12:39
【问题描述】:

我执行了以下代码:

tau <- 0.25
h <- 0.6 * n ^ (-1 / 5) * (4.5 * dnorm(qnorm(tau)) ^ 4 * qnorm(tau) / 
 (2 * (qnorm(tau) ^ 2 + 1)) ^ 2) ^ (1/5),

并且 R 继续产生NaN。然而,R 实际上计算 (4.5 * dnorm(qnorm(tau)) ^ 4 * qnorm(tau) / (2 * (qnorm(tau) ^ 2 + 1)) ^ 2) 等于 -0.003655336

奇怪的是当我执行以下操作时

k <- -0.003655336
k ^ (1 / 3)

NaN 再次生成。

【问题讨论】:

  • 您能举一个可重现的例子吗?以及 n 和 k 的值

标签: r nan


【解决方案1】:

您正在计算负数的立方根。尽管正如@mra68 所指出的,存在一个真正的解决方案,但负数的非整数指数的一般情况会导致复数。由于默认情况下 R 假定您正在处理实数,因此它会生成 NaN

试试这个:

k <- -0.003655336
k <- as.complex(k)
k ^ (1 / 3)
#[1] 0.0770216+0.1334053i

在有三个复数x满足条件x^3=k(包括虚部为零的情况)的意义上,结果并不唯一,但NaN的输出与一般情况一致非整数作为负实数的指数的情况。有人可能会争辩说,区分有理指数和非有理指数可能是有用的,但在浮点计算中这几乎是不可能的。在负数的非整数指数的情况下,我认为NaN 的出现是一个有用的警告信号。

【讨论】:

  • 每个实数,无论是正数还是负数,都有一个实数立方根,因为 3 是奇数。如果我们对其他两个(非实数)立方根不感兴趣,这里真的没有必要使用复数。不幸的是,在您的解决方案中,只有一个非实立方根出现。
  • 每个正实数也有三个立方根,其中只有一个是实数。因此,如果实数为负数,但如果实数为负数,则不是将NaN 作为实数立方根的结果,因此存在三个立方根这一事实并不是一个很好的理由。 (不公平,不是吗?)但它似乎是这样实现的。原因可能是 R 首先计算 1/3,然后将其视为任何其他实数 a。它是奇数自然数的倒数这一事实不再可见。如果x^a 中的数字x 是正数,则无关紧要,如果是负数,则有关系,
  • @mra68 我同意你说的;但我认为这确实是一种特殊情况,因为指数中的分母是整数。如果 R 将(如我假设的)1/3 转换为浮点数,R 就无法真正知道这一点。以x=(-k)^0.3333333332 为例,k 是一个正实数,对于x,您将没有任何真正的解决方案。一般来说,当非整数指数应用于负数时,我会非常小心,我认为在这种情况下 R 给出 NaN 是一个很好的警告信号。
  • @mra68 感谢您的意见;我相应地编辑了我的答案。
【解决方案2】:

负数的 5 次根仍然是可能的。我的袖珍计算器也可以。由于(-1)^5=-1,所以可以这样:

> tau <- 0.25

> a <- (4.5 * dnorm(qnorm(tau)) ^ 4 * qnorm(tau) / (2 * (qnorm(tau) ^ 2 + 1)) ^ 2)

> sign(a)*abs(a)^ (1/5)
[1] -0.3255258
> 

【讨论】:

    【解决方案3】:

    请编辑您的问题。 你给了自己答案。是基础数学。您不能将负数的幂赋予十进制数的幂。这是一种不确定性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2021-09-09
      • 2015-11-17
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多