在以下代码中:
(-8/27)^(2/3)
我得到了结果NaN
,尽管正确的结果应该是4/9
或.444444...
。
那为什么它会返回NaN?我怎样才能让它返回正确的值?
答案 0 :(得分:7)
如help("^")
中所述:
例如,用户有时会对返回的值感到惊讶 为什么'(-8)^(1/3)'是'NaN'。对于双输入,R使用IEC 所有平台上的60559算术,以及C系统 '^'运算符的函数'pow'。相关标准 在许多极端情况下定义结果。特别是结果 在上面的例子中,C99标准强制要求。很多 与Unix相似的系统命令'man pow'给出了详细信息 大量极端情况下的值。
所以你需要分开进行操作:
R> ((-8/27)^2)^(1/3)
[1] 0.4444444
答案 1 :(得分:7)
这是复杂域中的操作,R支持:
(-8/27+0i)^(2/3)
[1] -0.2222222+0.3849002i
测试:
> ((-8/27+0i)^(2/3) )^(3/2)
[1] -0.2962963+0i
> -8/27 # check
[1] -0.2962963
此外,复合物也是根:
(-0.2222222-0.3849002i)^(3/2)
[1] -0.2962963-0i
问题是-8/27的第三个根是什么:
polyroot( c(8/27,0,0,1) )
[1] 0.3333333+0.5773503i -0.6666667-0.0000000i 0.3333333-0.5773503i
中间值是真正的根。既然你说-8/27 = x ^ 3你真的要求立方方程的解:
0 = 8/27 + 0*x + 0*x^2 + x^2
polyroot
函数需要这4个系数值,并将返回复杂和真实的根。