Python中的负幂

7

我有这个问题

>>> import math
>>> math.pow(-1.07,1.3)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
ValueError: math domain error

有什么建议吗?

4
引用手册上的内容:“如果x和y都是有限数,且x为负数,y不是整数,则pow(x, y)未定义,并引发ValueError异常。” - zellus
6个回答

24

(-1.07)1.3 不是一个实数,因此出现了“Math domain error(数学域错误)”。

如果你需要一个复数,ab 必须被重写为 eb ln a,例如:

>>> import cmath
>>> cmath.exp(1.3 * cmath.log(-1.07))
(-0.6418264288034731-0.8833982926856789j)

如果你只想返回NaN,就要捕获该异常。

>>> import math
>>> def pow_with_nan(x, y):
...   try:
...     return math.pow(x, y)
...   except ValueError:
...     return float('nan')
...
>>> pow_with_nan(1.3, -1.07)   # 1.3 ** -1.07
0.755232399659047
>>> pow_with_nan(-1.07, 1.3)   # (-1.07) ** 1.3
nan

顺便提一下,在Python中通常使用内置的a ** b来表示乘方,而不是math.pow(a, b)

>>> 1.3 ** -1.07
0.755232399659047
>>> (-1.07) ** 1.3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
>>> (-1.07+0j) ** 1.3
(-0.6418264288034731-0.8833982926856789j)

9
不要使用pow函数,而是将指数变成复数(在其后添加0j)。以下是一个示例:
In [15]: (-1.07)**(1.3+0j)
Out[15]: (-0.64182642880347307-0.88339829268567893j)

不需要数学函数 :)

2

复数(和负数)的非整数次幂涉及一个重要的细节。指数函数在实数线上是单射的;即exp(a) = exp(b)意味着a = b。但在复平面上并非如此。由于exp(2*pi*i) = 1,指数函数是2*pi*i周期性的。

这引出了一个问题:我们使用哪个对数函数分支?这个问题是复分析的核心问题之一。

Python 对这种情况做出了智能响应。除非你明确使用它的复数构造器,否则你将只处理实数。由于负数的分数次幂永远不是实数,因此Python会适当地抛出异常。


1

我正在使用Python 2.5.4,我得到了这个:

>>> import math
>>> math.pow(-1.07,1.3)  
nan

你使用的是哪个Python版本?

0

负数底数的幂是复数。以下是一个例子,说明如何修复它:

from numpy import *
t  = arange(-3, 3, 0.1)

for n in range(0,len(t)):
    T = t[n]
    x = (complex(-0.5,0))**T
    print(T, x)

0
从这个帖子的标题表明power为负数,你是不是想要1.3-1.07而不是-1.071.3

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