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

6 回答 6

26

(-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)
于 2010-11-06T19:23:34.847 回答
9

不要使用 pow,并使指数复杂(添加0j到它)。这是一个例子:

In [15]: (-1.07)**(1.3+0j)
Out[15]: (-0.64182642880347307-0.88339829268567893j)

不需要数学函数:)

于 2010-11-06T19:26:39.040 回答
2

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

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

你用的是什么python版本?

于 2010-11-06T19:23:27.660 回答
2

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

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

Python 正在智能地应对这种情况。除非你明确地使用它的复数构造函数,否则你将交易实数。由于负数的分数幂从来都不是真实的,Python 适当地抛出了一个异常。

于 2010-12-04T14:28:05.100 回答
0

从这篇文章的标题表明是负的,你是否真的想要 1.3 -1.07而不是 -1.07 1.3

于 2010-11-07T14:58:56.353 回答
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)
于 2018-11-18T00:07:27.323 回答