Python Forum
Fractional Exponent Question - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Fractional Exponent Question (/thread-1097.html)



Fractional Exponent Question - Flexico - Dec-03-2016

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?


RE: Fractional Exponent Question - sparkz_alot - Dec-03-2016

hmm

>>>
>>> -6 ** (1/3)
-1.8171205928321397
>>>
>>>



RE: Fractional Exponent Question - Flexico - Dec-04-2016

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]