Haskell 98 - Standard Prelude - Floating Class

Dylan Thurston dpt@math.harvard.edu
Tue, 16 Oct 2001 00:27:36 +0900

On Mon, Oct 15, 2001 at 03:52:06PM +0200, Kent Karlsson wrote:
> > Simon Peyton-Jones:
> > > Russell O'Connor suggests:
> > > | but sinh and cosh can easily be defined in terms of exp
> > > | sinh x = (exp(x) - exp(-x))/2
> > > | cosh x = (exp(x) + exp(-x))/2
> > > This looks pretty reasonable to me.  We should have default methods
> > > for anything we can.
> Mathematically, yes.  Numerically, no.  Even if 'exp' is implemented
> with high accuracy, the suggested defaults may return a very
> inaccurate (in ulps) result.  Take sinh near zero.  sinh(x) with x
> very close to 0 should return x.  With the above 'default' sinh(x)
> will return exactly 0 for a relatively wide interval around 0, which
> is the wrong result except for 0 itself.

Hmm, on these grounds the current default definition for tanh x is
even worse behaved:

    tanh x = sinh x / cosh x

For moderately large floating point x, this will overflow.

Frankly, I don't think the whole discussion matters very much; nobody
who cares will use the default definitions.  But remember to think
about branch cuts.

And why not go further?

    cos x = (exp (i*x) + exp (-i*x))/2  where i = sqrt (-1)


> In general, this is why LIA-2 (Language Independent Arithmetic, part
> 2, "Elementary numerical functions", ISO/IEC 10967-2:2001) rarely
> attempts to define one numerical operation in terms of other
> numerical operations.  That is done only when the relationship is
> exact (even if the operations themselves are inexact).  That is not
> the case for the abovementioned operations. But it is the case for
> the relationship between the complex sin operation and the complex
> sinh operation, for instance. (Complex will be covered by LIA-3.)

This sounds like a very interesting standard.  I am constantly annoyed
by ISO's attempts to hide their standards; one might wonder what the
purpose is of having unavailable "standards".  Is the content
available somewhere?

	Dylan Thurston