如何取负数的任意幂

Posted

技术标签:

【中文标题】如何取负数的任意幂【英文标题】:How to take an arbitrary power of a negative number 【发布时间】:2020-12-22 15:18:22 【问题描述】:

当尝试将负数(例如 np.sin(5))提高到小于 1 的任意数量级(例如 1/3)时,即使使用 np.power 也会导致错误。但是为什么会这样?如何避免输出真实答案(例如-0.9861162244048773)?

import numpy as np

np.sin(5)
#Out: -0.9589242746631385

(np.sin(5))**(3)
#Out: -0.881765166036633

(np.sin(5))**(1/3)
__main__:1: RuntimeWarning: invalid value encountered in double_scalars

np.power(np.sin(5),3)
#Out: -0.881765166036633

np.power(np.sin(5),1/3)
__main__:1: RuntimeWarning: invalid value encountered in power
#Out: nan

#The correct answer sought to (np.sin(5))**(1/3) is -0.9861162244048773
-0.9861162244048773*-0.9861162244048773*-0.9861162244048773 == np.sin(5)
#Out: True

【问题讨论】:

【参考方案1】:

如果你坚持算术规则,就不允许计算负数的幂,除非幂是整数(这里不需要,因为你说power < 1OR 你可以扩展有效数字的范围以包含复数 或者你可以取它的立方根(正如1/3 所暗示的那样)。

对于复数,您可以使用任何 numpy 方法计算任意数的幂:

np.sin(5 + 0j)**(1/3)
(np.sin(5) + 0j)**(1/3)
np.power(np.sin(5) + 0j, 1/3)

都会输出正确答案:

# Out: (0.4930581122024387+0.8540017014186199j)

对于立方根,您需要坚持使用特定的立方根方法:

np.cbrt(np.sin(5))
# Out: -0.9861162244048773

对于幂是分数的特殊情况,其中分子是偶正数,f.i. power=2/3:

(np.sin(5)**2)**(1/3)

【讨论】:

以上是关于如何取负数的任意幂的主要内容,如果未能解决你的问题,请参考以下文章

任意正整数拆分成2的指数幂(2的N次方)之和表示

如何计算任意功率/根?

快速逆任意幂根算法实现

Choosing number ZOJ - 3690 (矩阵快速幂)

python3怎么取幂

牛客-开心的涂刷——数学分析+快速幂取模问题