[Haskell-cafe] Default implementation of Floating (**)
ietf-dane at dukhovni.org
Wed May 19 15:13:30 UTC 2021
On Wed, May 19, 2021 at 11:50:22AM -0300, Fabrício Olivetti de França wrote:
> Investigating the source of this problem, I found that it uses the
> default implementation of (**) from base defined as x ** y = exp (log
> x * y).
The type of (**) is: Floating a => a -> a -> a
with the base and exponent having the same type.
The only practical way to define pow(x, y) for a floating point y, is
via the exp() and log() functions.
> 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:
λ> exp(log(-2) * (-2))
were you expecting these to check for non-positive inputs and to throw a
floating point exception? When I compile and run:
int main(int argc, char *argv)
char *arg = argv ? argv : "1.0";
double d = atof(arg);
printf("log %s = %f\n", argv ? arg, log(d));
$ ./log -2
log -2 = nan
$ ./log 0
log 0 = -inf
so it rather looks like GHC's `log` returns whatever the underlying
floating point library returns...
More information about the Haskell-Cafe