
There are a lot of misunderstandings in this thread. It's probably best to start by reading up on the roots of unity ( https://en.wikipedia.org/wiki/Root_of_unity). The key ideas are that a real number has two complex square roots, three complex cube roots, and so on. Normally, in Python, we return the principal square root ( http://mathworld.wolfram.com/PrincipalSquareRoot.html). We would do the same for the cube root I imagine if we had a cube root function Let's call that the principal cube root, which is always real for a real-valued input. ---
For positive numbers, I believe you're correct. For negative numbers, no.
Actually, Jonathan is right.
(-2)**(2/3) (-0.7937005259840993+1.3747296369986026j)
This is just giving you one of the other two cube roots.
Rounding error aside, raising -2 to 2/3 power and then raising the result to 3/2 power gives back -2, as it should.
There is no way to guarantee that "it should do this". A fractional power is not a function, and so it has no inverse function.
Doing it in two steps loses the negation, and then (again, within rounding error) the end result is positive two.
I think you would see your mistake if you applied this logic to -1 ** 2 ** (1/2). On Thu, Aug 30, 2018 at 3:08 AM Greg Ewing <greg.ewing@canterbury.ac.nz> wrote:
Jonathan Goble wrote:
How? Raising something to the 2/3 power means squaring it and then taking the cube root of it.
On reflection, "wrong" is not quite accurate. A better word might be "surprising".
(-1) ** (2/3) == 1 would imply that 1 ** (3/2) == -1.
I suppose that could be considered true if you take the
negative solution of the square root, but it seems a bit strange, and it's not what Python gives you for the result of 1 ** (3/2).
Python gives you the principle root when you do 1 ** (3/2), which is exactly what I'm proposing for Fraction.
If you want a solution that round-trips, you need complex numbers.
There is no solution that round trips since in general fractional powers are not functions. The case in which you can always round trip is when you are taking a power c ** (a/b) where a is odd, and either c is positive or b is odd. Then, the result to the power of (b/a) gives you c. That's what Python does when you use
floats. Making Fractions do something different would make it inconsistent with floats.
Actually, my cases are all examples of the principal roots and are consistent with floats.
My calculator (which only does real floats) reports an error when trying to evaluate (-1) ** (2/3).
Yes, which is what Python does with reals. The difference is the the Fraction type has exact values, and it knows that the unique answer in the field of Fraction objects is 1.
-- Greg
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/
--
--- You received this message because you are subscribed to a topic in the Google Groups "python-ideas" group. To unsubscribe from this topic, visit https://groups.google.com/d/topic/python-ideas/aZIHpPhe0mw/unsubscribe. To unsubscribe from this group and all its topics, send an email to python-ideas+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/d/optout.