bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: About missing inverse hyperbolic function


From: Bruno Haible
Subject: Re: About missing inverse hyperbolic function
Date: Wed, 2 Jan 2008 23:55:17 +0100 (MET)

Hello,

Bastien Roucaries wrote:

> I need for my program to use asinh acosh and atanh. For now I used to define
> 
> it if missing using
> #define asinh(x) log(x+sqrt(x*x+1))
> #define acosh(x) log(x+sqrt(x-1.0)*sqrt(x+1.0))
> #define atanh(x)  (0.5*log(x+1)-0.5*log(1-x))
> 
> How can I create a gnulib module in order to do that?

First, look in the gnulib documentation which portability problems are already 
known and which of them are already handled by gnulib. In this case, you see 
that the problem is that mingw does not provide the functions, and that gnulib 
provides no workaround so far.

Second, decide which include file should declare the functions. POSIX says 
<math.h> in this case; in gnulib the source code of this file is in 
lib/math.in.h. Try to write the declarations here. Add the proper autoconf 
tests; see e.g. how it was done for the 'trunc' function or some other 
functions.

Third, write an implementation of these functions that is portable enough; each 
function it its own file.

The formula you gave for asinh(x) is ok for x >= 0; for x < 0 it is unusable 
since it will lead to numerical instability (i.e. rounding errors that are far 
too big).

The formula you gave for acosh(x) may be ok, but is it necessary to call sqrt 
twice?

The formula you gave for atanh(x): similarly, it is necessary to call log 
twice? Furthermore, for x near 0, say abs(x) < 2^-53, your formula will return 
0, which has a relative error of 100%; it's possible to do better.

Fourth, write a test suite for each function. The test suite should cover 
particular values as well as special cases like +/- infinity and NaN.

Then you can submit the patch here.

Bruno





reply via email to

[Prev in Thread] Current Thread [Next in Thread]