2010-11-06 9 views
7

que tiene este problemapow negativa en pitón

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

alguna sugerencia?

+4

citando el manual: "Si tanto x como y son finitos, x es negativo, y y no es un número entero, entonces pow (x, y) no está definido, y aumenta ValueError". – zellus

Respuesta

25

(-1.07) 1.3 no será un número real, por lo tanto, el error de dominio Math.

Si necesita un número complejo, un b debe reescribirse en e b ln un, por ejemplo,

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

Si solo desea devolver NaN, tome esa excepción.

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

Por cierto, en Python por lo general la incorporada en a ** b se utiliza para elevar el poder, no 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

estoy usando Python 2.5.4 y me sale esto:

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

¿Qué versión de Python está usando?

+2

Python ≥2.6 ya crea la excepción. – kennytm

9

No utilice prisionero de guerra, y crea el complejo exponente (0j añadir a ella). Aquí está un ejemplo:

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

No hay necesidad de funciones matemáticas :)

0

Desde el título de este post lo que indica que la potencia es negativa, ¿es posible que en realidad quería 1.3 - 1.07 en lugar de -1.07 1.3?

1

Los poderes no enteros de números complejos (y negativos) implican una sutileza importante. La función exponencial es inyectiva en la línea real; es decir, exp (a) = exp (b) implica a = b. Esto NO es así en el plano complejo. Como exp (2 * pi * i) = 1, la función exponencial es 2 * pi * i-periodic.

Esto lleva al problema: ¿Qué rama de la función de registro usamos? Dicha pregunta es una de las preguntas centrales del análisis complejo.

Python está respondiendo inteligentemente a esta situación. A menos que uses explícitamente su constructor de número complejo, estarás traficando en reales. Dado que las potencias fraccionarias de los negativos NUNCA son reales, Python está lanzando una excepción.