Python Forum

Full Version: Fractional Exponent Question
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
This response had me confused for a while:
>>> (-6)**(1/3)
(0.9085602964160701+1.5736725951324722j)
>>> abs(_)
1.8171205928321397
>>> (-_)**3
-6.0
Until I realized that in the complex number plane, numbers must have more than one cube root, just like on the real number line numbers have more than one square root. Is there a way to force the power function to return a real answer if one is available?
hmm

>>>
>>> -6 ** (1/3)
-1.8171205928321397
>>>
>>>
That's the equivalent of -(6**(1/3)) because the power operator takes precedence over the negation sign. Not the same as what I'm trying to do. It does give the correct answer in this case, but it might not for other fractional powers.

Alright, I made a function using the mpmath library that does what I want:
import mpmath
def root(z, n):
x = [mpmath.root(z,n,k) for k in range(n)]
for y in x:
if mpmath.im(y) == 0:
return y
return x[0]
The "mpmath.root(z,n,k)" part returns a list of all nth roots of z, and the for loop checks if any of them are real. Leaving this here just in case someone else encounters this. =]

Ok, let's try again and see if the tabs stay in this time:
import mpmath
def root(z, n):
	x = [mpmath.root(z,n,k) for k in range(n)]
	for y in x:
		if mpmath.im(y) == 0:
			return y
	return x[0]