отрицательная сила в питоне - PullRequest
7 голосов
/ 06 ноября 2010

У меня есть эта проблема

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

есть предложения?

Ответы [ 6 ]

25 голосов
/ 06 ноября 2010

(- 1,07) 1,3 не будет действительным числом, следовательно, ошибка Math домена.

Если вам нужно комплексное число, 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)
9 голосов
/ 06 ноября 2010

Не используйте pow, и сделайте показатель степени комплексным (добавьте к нему 0j). Вот пример:

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

Нет необходимости в математических функциях:)

2 голосов
/ 06 ноября 2010

Я использую Python 2.5.4 и получаю следующее:

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

Какую версию Python вы используете?

1 голос
/ 04 декабря 2010

Неинтегральные степени комплексных (и отрицательных) чисел связаны с важной тонкостью. Экспоненциальная функция инъективна на вещественной прямой; то есть exp (a) = exp (b) подразумевает a = b. Это не так на сложной плоскости. Поскольку exp (2 * pi * i) = 1, экспоненциальная функция является 2 * pi * i-периодической.

Это приводит к проблеме: какую ветвь функции журнала мы используем? Указанный вопрос является одним из центральных вопросов комплексного анализа.

Python разумно реагирует на эту ситуацию. Если вы явно не используете его конструктор комплексных чисел, вы будете торговать реалами. Поскольку дробные степени отрицаний НИКОГДА не реальны, Python соответствующим образом выдает исключение.

0 голосов
/ 18 ноября 2018

Степени отрицательных оснований являются комплексными числами.Вот пример, который объясняет, как это исправить:

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 голосов
/ 07 ноября 2010

Из заголовка этого поста видно, что сила отрицательна, возможно ли, что вы на самом деле хотели 1,3 -1,07 , а не -1,07 1,3

...