Haskell 98 - Standard Prelude - Floating Class

George Russell ger@tzi.de
Mon, 15 Oct 2001 18:27:52 +0200


Simon PJ wrote:
> Fpr the Revised Haskell 98 report, Russell O'Connor suggests:
>               =20
> | Also, I understand you are reluctant to make library changes,=20
> | but sinh and cosh can easily be defined in terms of exp
> |=20
> | sinh x =3D (exp(x) - exp(-x))/2
> | cosh x =3D (exp(x) + exp(-x))/2
> |=20
> | (source: Calculus Third Edition by Michael Spivak, page 349,=20
> | or any decent calculus book)
> |=20
> | I suggest removing sinh and cosh from the minimal complete=20
> | definition, and add the above defaults.
> 
> This looks pretty reasonable to me.  We should have default methods
> for anything we can.
> 
> Comments?
No.  As has been pointed out, this is a bad idea numerically
because it will give the wrong answer for sinh x for very small values of
x.  As a matter of fact, you will also get the wrong answer for very large
values of x, where exp(x) can overflow even though sinh x and cosh x don't,
meaning you get an incorrect answer of positive infinity.

I suggest saying as little about the transcendental functions as possible, rather
than forcing incorrect rules on the implementor.  I imagine most Haskell implementors
do not want to waste time writing their own transcendental function routines,
but simply call out to one of the various high-quality C implementations.  (Netlib
has a good free one, for example.)  This will probably produce better results than
suggesting buggy code to the implementor.

Technically, you would probably be able to define all the functions sinh/cosh/tanh/exp
functions with reasonable precision in terms of expm1, defined mathematically as
   expm1(x) = exp(x) - 1.
But please don't . . .