Valor incorrecto para la raíz cúbica en Python

Al usar Python 3.5 tanto en repl.it como en la consola de Windows, obtengo respuestas incorrectas para las raíces cúbicas.

Cuando la entrada es (-1)**(1/3) , obtengo el número complejo (0.5000000000000001 + 0.8660254037844386j) como la respuesta cuando debería ser simplemente -1. Cualquier valor negativo bajo esta raíz parece dar un resultado complejo.

¿Estoy haciendo algo mal?

La exponencia con bases negativas generalmente involucra números complejos, por lo que Python cambia a números complejos cuando ve la base negativa. Dicha exponenciación suele tener valores múltiples, y Python no siempre devuelve el valor que podría esperar.

Para el caso especial de la potencia 1/3 con bases reales, podría escribir una función como esta:

 def cubeRoot(x): if x >= 0: return x**(1/3) else: return -(-x)**(1/3) 

Lo que le dará la verdadera raíz cúbica esperada.

En realidad, Python no sabe que estás tomando una raíz cúbica.

Todo lo que ve es un argumento de punto flotante con un valor cercano a 0.3333333333 …, pero debido a la finitud de la representación, es imposible adivinar que quiere decir exactamente 1/3.

Así que todo lo que Python puede hacer es recurrir a la definición habitual de la exponenciación de bases negativas a una potencia real (twig principal), a través de la fórmula

 (-x)^y = exp(y(ln(x) + iπ) = exp(y ln(x)) (cos(yπ) + i sin(yπ)) 

lo que produce un valor complejo.

Obtendrá exactamente esta respuesta porque el operador de energía calcula

 x**y = exp(y*ln(x)) 

y si x no es un real positivo, su logaritmo se calcula a partir de la twig principal del logaritmo complejo

 ln(u+i*v)=0.5*ln(u²+v²) + i*arg(u+i*v) 

donde en los términos de la biblioteca matemática arg(u+i*v)=atan2(v,u) .

Así, ln(-1)=i*pi y

 (-1)**(1.0/3)=exp(i*pi/3)=cos(pi/3)+i*sin(pi/3) 

que tiene el valor que tienes Se producen errores de punto flotante ya que y=1.0/3 no es exactamente 1/3 , pi no es exactamente la constante matemática del mismo nombre y las funciones trigonométricas también son aproximaciones a las funciones matemáticas exactas.