在以下代码中:
(-8/27)^(2/3)
我得到了结果NaN
,尽管正确的结果应该是4/9
or .444444...
。
那么为什么它返回 NaN 呢?我怎样才能让它返回正确的值?
如记录在help("^")
:
用户有时会对返回的值感到惊讶,例如为什么 '(-8)^(1/3)' 是 'NaN'。对于双输入,R 在所有平台上使用 IEC 60559 算法,以及用于“^”运算符的 C 系统函数“pow”。相关标准定义了许多极端情况下的结果。特别是,上面示例中的结果是由 C99 标准规定的。在许多类 Unix 系统上,命令“man pow”给出了大量极端情况下的值的详细信息。
所以你需要单独做这些操作:
R> ((-8/27)^2)^(1/3)
[1] 0.4444444
这是 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 个系数值,并将返回复数和实数根。