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は実数ではないため、Mathドメインエラーになります。

複素数が必要な場合は、abをeblnaに書き換える必要があります。

>>> 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

私はPython2.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-周期的です。

これは問題につながります:ログ関数のどのブランチを使用しますか?この質問は、複雑な分析の中心的な質問の1つです。

Pythonはこの状況にインテリジェントに対応しています。複素数コンストラクターを明示的に使用しない限り、実数でトラフィッキングすることになります。負の分数の累乗は決して現実的ではないため、Pythonは適切に例外をスローしています。

于 2010-12-04T14:28:05.100 に答える
0

パワーが負であることを示すこの投稿のタイトルから、あなたが実際に-1.071.3ではなく1.3-1.07を望んでいた可能性はありますか?

于 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 に答える