<div dir="ltr"><div>The issue here, I guess, is that this behavior is inconsistent.<br></div><div><br></div><div>While the default implementation for (**) would produce NaNs and such, the implementation for Float and Double overrides this behavior:<br><br>> (-3 :: Float) ** (-5)<br>-4.115226e-3<br>> (-3 :: Double) ** (-5)<br>-4.11522633744856e-3<br></div><div><br></div><div>Which is in accordance to what other languages such as C and Python do (and also to what I would expect):</div><div><br></div><div>C<br>float b = -3.0;<br>float e = -5.0;<br>printf("%f\n", powf(b, e));<br></div><div><br></div><div>-0.004115</div><div><br></div><div>python<br></div><div>>>> -3.0 ** -5.0<br>-0.00411522633744856</div><div><br></div><div>The Haskell Report is not clear (or at least I was not able to find a clearer explanation) about this:</div><div><br></div><div style="margin-left:40px">6.4.3 Exponentiation and Logarithms <br></div><div style="margin-left:40px">The one-argument exponential function exp and the logarithm function log act on floating-point numbers and use base e. logBase a x returns the logarithm of x in base a. sqrt returns the principal square root of a floating-point number. There are three two-argument exponentiation operations: (^) raises any number to a nonnegative integer power, (^^) raises a fractional number to any integer power, and (⋆⋆)takes two floating-point arguments. The value of x^0 or x^^0 is 1 for any x, including zero; 0⋆⋆y is 1 if y is 1, and 0 otherwise.</div><div><br></div><div>Regards,</div><div><br></div><div>Emilio<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 19, 2021 at 12:29 PM Henning Thielemann <<a href="mailto:lemming@henning-thielemann.de">lemming@henning-thielemann.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
On Wed, 19 May 2021, Viktor Dukhovni wrote:<br>
<br>
> On Wed, May 19, 2021 at 11:50:22AM -0300, Fabrício Olivetti de França wrote:<br>
><br>
>> So I was wondering, is there any reason to have this (potentially<br>
>> dangerous) default implementation on base?<br>
><br>
> The behaviour for negative inputs seems to be correct:<br>
><br>
>    λ> log(-2)<br>
>    NaN<br>
>    λ> exp(log(-2))<br>
>    NaN<br>
>    λ> exp(log(-2) * (-2))<br>
>    NaN<br>
>    λ> log(0)<br>
>    -Infinity<br>
><br>
> were you expecting these to check for non-positive inputs and to throw a<br>
> floating point exception?<br>
<br>
<br>
I guess he expects (-2)**(-2) = 1/4.<br>
<br>
But defined this way, (**) would be rather discontinuous._______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>