为什么这给了我一个NaN

时间:2014-10-02 20:50:15

标签: r

我的问题是我试图计算$( - 1)^ {1/3} $,但是当我要求R计算它时会发生NaN。

> (-1)^(1/3)

[1] NaN

我真的不知道为什么?我使用的是R 2.15。 我想计算$( - 1)^ {1/3} $ 在现实生活中$( - 1)^ {1/3} = - 1 $应该是-1的立方根。

任何想法??

1 个答案:

答案 0 :(得分:4)

产生

NaN是因为-1的最大根是复杂的。您会看到(-1)^(1/2)的相同行为。这是因为正常计算中不支持复数,正如您所假设的那样,除非您之前强迫基数变得复杂。

尝试

R> (-1+0i)^(1/3)
[1] 0.5+0.866025i

R> as.complex(-1)^(1/3)
[1] 0.5+0.866025i

您可以在此处阅读有关立方根的更多信息: http://mathworld.wolfram.com/CubeRoot.html

编辑:

好吧,我上面的建议比解答更有解决方法。我将尝试更详细地解释它。虽然你需要查看C标准库函数,但很快就会变得很毛茸茸。

正如@whuber和@NickCox在评论中建议的那样,答案是NaN是一个很好的理由。查看^运算符的源代码,您可以看到此案例将使用标准库double pow (double base, double exponent);中的C函数math.h进行计算。此功能具有相同的行为。

作为示例,您可以查看此实现:http://www.netlib.org/fdlibm/e_pow.c在此您可以看到列出的一些特殊情况如下:

/*
 * Special cases:
 *  1.  (anything) ** 0  is 1
 *  2.  (anything) ** 1  is itself
 *  3.  (anything) ** NAN is NAN
 *  4.  NAN ** (anything except 0) is NAN
 *  5.  +-(|x| > 1) **  +INF is +INF
 *  6.  +-(|x| > 1) **  -INF is +0
 *  7.  +-(|x| < 1) **  +INF is +0
 *  8.  +-(|x| < 1) **  -INF is +INF
 *  9.  +-1         ** +-INF is NAN
 *  10. +0 ** (+anything except 0, NAN)               is +0
 *  11. -0 ** (+anything except 0, NAN, odd integer)  is +0
 *  12. +0 ** (-anything except 0, NAN)               is +INF
 *  13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
 *  14. -0 ** (odd integer) = -( +0 ** (odd integer) )
 *  15. +INF ** (+anything except 0,NAN) is +INF
 *  16. +INF ** (-anything except 0,NAN) is +0
 *  17. -INF ** (anything)  = -0 ** (-anything)
 *  18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
 *  19. (-anything except 0 and inf) ** (non-integer) is NAN
 */

其中19对应于您的情况。在这种情况下,它会放弃并返回nan

/* (x<0)**(non-int) is NaN */
if((n|yisint)==0) return (x-x)/(x-x);

确定。那么当我们将基数变为复杂时会发生什么呢?

然后我们将使用double complex cpow (double complex x, complex double y)库中的函数complex.h。此函数可以处理复数,因此不会以相同的方式快捷方式。将结果计算为

double complex cpow (double complex base, double complex power)
{
  return cexp (power * clog (base)); 
}

这与你在@ whuber的评论中看到的相同。除了这个函数可以处理复数。

我不确定这个解释是否更好,即使它详细说明但我希望我已经以这种或那种方式回答了你的问题。