8

在以下代码中:

(-8/27)^(2/3)

我得到了结果NaN,尽管正确的结果应该是4/9or .444444...

那么为什么它返回 NaN 呢?我怎样才能让它返回正确的值?

4

2 回答 2

7

如记录在help("^")

用户有时会对返回的值感到惊讶,例如为什么 '(-8)^(1/3)' 是 'NaN'。对于双输入,R 在所有平台上使用 IEC 60559 算法,以及用于“^”运算符的 C 系统函数“pow”。相关标准定义了许多极端情况下的结果。特别是,上面示例中的结果是由 C99 标准规定的。在许多类 Unix 系统上,命令“man pow”给出了大量极端情况下的值的详细信息。

所以你需要单独做这些操作:

R> ((-8/27)^2)^(1/3)
[1] 0.4444444
于 2013-10-17T21:36:32.503 回答
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 个系数值,并将返回复数和实数根。

于 2013-10-17T21:43:49.750 回答