如何在R中计算任何负数的某个分数次幂?

9
在下面的代码中:
(-8/27)^(2/3)

我收到的结果是“NaN”,虽然正确的结果应该是“4/9”或“0.44444...”。
那么为什么会返回NaN?如何让它返回正确的值?

1
理论上,你不能真正将一个负数乘以一个非整数的指数。例如,想想(-1)^1.5实际代表什么意思。任何非整数幂次都需要复杂的根号。 - Señor O
为了保持数学上的一致性,在我看来,你应该将负数保留在括号外面(或者按照下面所示的方式拆分操作)。 - Señor O
那么你的意思是我应该写成-(8/27)^(2/3)吗?这样答案就变成了-4/9,而不是4/9 - Blaszard
2
你需要将指数的分子也展开(所以从技术上讲,它与下面的式子是相同的)(-1) ^ 2 * (8/27)^(2/3) - Señor O
@SeñorO -- 在这里查看,讨论了指数运算的一种含义,可以回答OP的问题,而不涉及复数。 - Josh O'Brien
2个回答

8
根据help("^")的记录:
用户有时会对返回的值感到惊讶,例如为什么‘(-8)^(1/3)’是‘NaN’。对于双精度输入,在所有平台上,R使用IEC 60559算法以及C系统函数‘pow’来处理‘^’运算符。相关标准在许多边界情况下定义了结果。特别是,上述示例中的结果由C99标准规定。在许多类Unix系统上,命令‘man pow’可以详细说明许多角落情况中的值。
因此,您需要分别执行操作:
R> ((-8/27)^2)^(1/3)
[1] 0.4444444

1
所以,如果OP想要4/9,他们需要先将其平方,然后再取立方根。 - joran
1
它应该输出什么?-8/27没有实数立方根 - Señor O
1
@Metrics:是的,因为您仍在尝试将负数提高到非整数次幂。man pow说:“如果x是小于0的有限值,y是有限的非整数,则会发生域错误,并返回NaN。”(其中x是底数,y是指数)。 - Joshua Ulrich
所以,当你的起始幂是奇数时,这不适用。正如你所看到的 `((-8/27)^3)^(1/3)[1] NaN ((-8/27)^4)^(1/3) [1] 0.1975309
((-8/27)^5)^(1/3) [1] NaN ((-8/27)^1)^(1/3) [1] NaN`。感谢澄清。
- Metrics
4
当然有,它是 -2/3 - eddi
显示剩余4条评论

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个系数值,并将返回复数和实数根。

4
如果你去弄懂你不理解的魔法,呃,数学,有时会出现你没有意识到的其他维度的小精灵。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接