我的问题是我试图计算$( - 1)^ {1/3} $,但是当我要求R计算它时会发生NaN。
> (-1)^(1/3)
[1] NaN
我真的不知道为什么?我使用的是R 2.15。 我想计算$( - 1)^ {1/3} $ 在现实生活中$( - 1)^ {1/3} = - 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的评论中看到的相同。除了这个函数可以处理复数。
我不确定这个解释是否更好,即使它详细说明但我希望我已经以这种或那种方式回答了你的问题。