The issue here, I guess, is that this behavior is inconsistent.

While the default implementation for (**) would produce NaNs and such, the implementation for Float and Double overrides this behavior:

> (-3 :: Float) ** (-5)
-4.115226e-3
> (-3 :: Double) ** (-5)
-4.11522633744856e-3

Which is in accordance to what other languages such as C and Python do (and also to what I would expect):

C
float b = -3.0;
float e = -5.0;
printf("%f\n", powf(b, e));

-0.004115

python
>>> -3.0 ** -5.0
-0.00411522633744856

The Haskell Report is not clear (or at least I was not able to find a clearer explanation) about this:

6.4.3 Exponentiation and Logarithms
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.

Regards,

Emilio

On Wed, May 19, 2021 at 12:29 PM Henning Thielemann <lemming@henning-thielemann.de> wrote:

On Wed, 19 May 2021, Viktor Dukhovni wrote:

> On Wed, May 19, 2021 at 11:50:22AM -0300, Fabrício Olivetti de França wrote:
>
>> So I was wondering, is there any reason to have this (potentially
>> dangerous) default implementation on base?
>
> The behaviour for negative inputs seems to be correct:
>
>    λ> log(-2)
>    NaN
>    λ> exp(log(-2))
>    NaN
>    λ> exp(log(-2) * (-2))
>    NaN
>    λ> log(0)
>    -Infinity
>
> were you expecting these to check for non-positive inputs and to throw a
> floating point exception?


I guess he expects (-2)**(-2) = 1/4.

But defined this way, (**) would be rather discontinuous._______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.