First a bit of deconfusion: negative exponents just mean x⁻² = 1/x². That works
just fine and is not relevant to this ticket:
<ZoffixW> m: say (-2) ** -2
<camelia> rakudo-moar 605f27: OUTPUT«0.25»
Fractional exponents mean the number is raised to the power of the numerator
and then the denominator-th-root is taken from it. So raising to 0.1th power
simply means we take 10th root:
<ZoffixW> m: say 1024 ** .1
<camelia> rakudo-moar 605f27: OUTPUT«2»
So far so good for positive base numbers, but some stuff appears to be broken
for roots of negatives. First, the NaN case described in this ticket:
<ZoffixW> m: say (-1) ** .5
<camelia> rakudo-moar 605f27: OUTPUT«NaN»
We're taking a square root of a negative number which "doesn't exist", so we're
dealing with Complex numbers.
The NaN result matches what we'd get from sqrt(), so this case is fine:
<ZoffixW> m: say sqrt(-1)
<camelia> rakudo-moar 605f27: OUTPUT«NaN»
BUT, unlike sqrt(), if we request to deal with Complex numbers, the output from
the infix:<**> is incorrect:
<ZoffixW> m: say sqrt(-1+0i)
<camelia> rakudo-moar 605f27: OUTPUT«0+1i»
<ZoffixW> m: say (-1+0i) ** .5
<camelia> rakudo-moar 605f27: OUTPUT«6.12323399573677e-17+1i»
Moreover, if we raise a negative number to an *odd* power, the result will be
negative:
<ZoffixW> m: say (-5)**3
<camelia> rakudo-moar 605f27: OUTPUT«-125»
This means that taking an *odd* root doesn't have anything to do with Complex
numbers and should Just Work™, but Rakudo still gives us a NaN, instead of the
original -5:
<ZoffixW> m: say (-125)**(1/3)
<camelia> rakudo-moar 605f27: OUTPUT«NaN»
We can try using the "Complex mode", and that doesn't give NaN, but the result
is wrong, so we can't use that to perform such a computation:
<ZoffixW> m: say (-125+0i) ** (1/3)
<camelia> rakudo-moar 605f27: OUTPUT«2.5+4.33012701892219i»
<ZoffixW> m: say (-125+0i) ** ((1+0i)/(3+0i))
<camelia> rakudo-moar 605f27: OUTPUT«2.5+4.33012701892219i»
In summation, the buggy behaviour revealed by this ticket is:
(a) odd roots (rational powers with odd denominators) produce NaN instead
of actual non-complex result
(b) rational powers on complex numbers produce wrong results
On Sat Jul 09 09:51:38 2016, pmichaud wrote:
> On Sat, Jul 09, 2016 at 05:19:49AM -0700, Itsuki Toyota wrote:
> > See the following results
> >
> > $ perl6 -e 'say -1 ** -0.1'
> > -1
> > $ perl6 -e 'say reduce * ** *, -1, (-0.1)'
> > NaN
>
> This is not a bug in "reduce" itself. Exponentiation has higher
> precedence than unary minus, so the first expression is being
> parsed and executed as -(1 ** -0.1) and not (-1) ** -0.1.
> From my rakudo (ver 2016.06-50-g5a4963f):
>
> $ ./perl6 -e 'say -1 ** -0.1'
> -1
> $ ./perl6 -e 'say (-1) ** -0.1'
> NaN
>
> So, the reduce subroutine is doing exactly the same thing as
> &infix:<**> here does with a negative base.
>
> At the moment I'm inclined to believe that a negative integer with
> negative exponent should return NaN, but someone with more mathematics
> sense than I would have to make that call.
>
> Pm