2010-11-06 14 views
7

ho questo problemapow negativo in python

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

qualsiasi suggerimento?

+4

citando il manuale: "Se entrambi xey sono finiti, x è negativo e y non è un numero intero allora pow (x, y) non è definito e solleva l'errore ValueError." – zellus

risposta

25

(-1.07) 1.3 non sarà un numero reale, quindi l'errore del dominio Math.

Se avete bisogno di un numero complesso, un b deve essere riscritto in e b ln un, per esempio

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

Se si desidera restituire NaN, rilevare tale eccezione.

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

BTW, in Python di solito il built-in a ** b viene utilizzato per la raccolta di potere, non 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) 
2

Sto usando Python 2.5.4 e ottengo questo:

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

Quale versione python stai usando?

+2

Python ≥2.6 crea già l'eccezione. – kennytm

9

Non usare pow, e rendere il complesso esponente (aggiungi 0j ad esso). Ecco un esempio:

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

Non c'è bisogno di funzioni matematiche :)

0

Dal titolo di questo post indicando che il potere è negativo, è possibile che in realtà voleva 1.3 - 1,07 anziché -1,07 1,3?

1

Le potenze non truccate di numeri complessi (e negativi) implicano un'importante sottigliezza. La funzione esponenziale è iniettiva sulla linea reale; es. exp (a) = exp (b) implica a = b. Questo NON è così sul piano complesso. Poiché exp (2 * pi * i) = 1, la funzione esponenziale è 2 * pi * i-periodic.

Questo porta al problema: quale ramo della funzione di registro utilizziamo? Tale domanda è una delle questioni centrali dell'analisi complessa.

Python sta rispondendo in modo intelligente a questa situazione. A meno che tu non usi esplicitamente il suo costruttore di numeri complessi, stai per essere traffico di real. Dato che i poteri frazionari dei negativi non sono MAI reali, Python sta gettando un'eccezione in modo appropriato.