我有这个问题
>>> import math
>>> math.pow(-1.07,1.3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
有什么建议吗?
(-1.07) 1.3不是实数,因此会出现数学域错误。
如果您需要一个复数,则 a b必须重写为 e b 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)
不要使用 pow,并使指数复杂(添加0j
到它)。这是一个例子:
In [15]: (-1.07)**(1.3+0j)
Out[15]: (-0.64182642880347307-0.88339829268567893j)
不需要数学函数:)
我正在使用 python 2.5.4,我得到了这个:
>>> import math
>>> math.pow(-1.07,1.3)
nan
你用的是什么python版本?
复数(和负数)的非整数幂涉及一个重要的微妙之处。指数函数在实线上是单射的;即 exp(a) = exp(b) 意味着 a = b。在复平面上并非如此。由于 exp(2*pi*i) = 1,指数函数是 2*pi*i 周期的。
这就引出了一个问题:我们使用日志函数的哪个分支?所述问题是复分析的核心问题之一。
Python 正在智能地应对这种情况。除非你明确地使用它的复数构造函数,否则你将交易实数。由于负数的分数幂从来都不是真实的,Python 适当地抛出了一个异常。
从这篇文章的标题表明幂是负的,你是否真的想要 1.3 -1.07而不是 -1.07 1.3?
负基的幂是复数。这是一个解释如何修复它的示例:
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)