diff options
Diffstat (limited to 'libm/float/atanhf.c')
| -rw-r--r-- | libm/float/atanhf.c | 92 | 
1 files changed, 92 insertions, 0 deletions
| diff --git a/libm/float/atanhf.c b/libm/float/atanhf.c new file mode 100644 index 000000000..dfadad09e --- /dev/null +++ b/libm/float/atanhf.c @@ -0,0 +1,92 @@ +/*							atanhf.c + * + *	Inverse hyperbolic tangent + * + * + * + * SYNOPSIS: + * + * float x, y, atanhf(); + * + * y = atanhf( x ); + * + * + * + * DESCRIPTION: + * + * Returns inverse hyperbolic tangent of argument in the range + * MINLOGF to MAXLOGF. + * + * If |x| < 0.5, a polynomial approximation is used. + * Otherwise, + *        atanh(x) = 0.5 * log( (1+x)/(1-x) ). + * + * + * + * ACCURACY: + * + *                      Relative error: + * arithmetic   domain     # trials      peak         rms + *    IEEE      -1,1        100000      1.4e-7      3.1e-8 + * + */ + +/*						atanh.c	*/ + + +/* +Cephes Math Library Release 2.2:  June, 1992 +Copyright (C) 1987, 1992 by Stephen L. Moshier +Direct inquiries to 30 Frost Street, Cambridge, MA 02140 +*/ + +/* Single precision inverse hyperbolic tangent + * test interval: [-0.5, +0.5] + * trials: 10000 + * peak relative error: 8.2e-8 + * rms relative error: 3.0e-8 + */ +#include <math.h> +extern float MAXNUMF; + +float logf( float ); + +float atanhf( float xx ) +{ +float x, z; + +x = xx; +if( x < 0 ) +	z = -x; +else +	z = x; +if( z >= 1.0 ) +	{ +	if( x == 1.0 ) +		return( MAXNUMF ); +	if( x == -1.0 ) +		return( -MAXNUMF ); +	mtherr( "atanhl", DOMAIN ); +	return( MAXNUMF ); +	} + +if( z < 1.0e-4 ) +	return(x); + +if( z < 0.5 ) +	{ +	z = x * x; +	z = +	(((( 1.81740078349E-1 * z +	  + 8.24370301058E-2) * z +	  + 1.46691431730E-1) * z +	  + 1.99782164500E-1) * z +	  + 3.33337300303E-1) * z * x +	  + x; +	} +else +	{ +	z = 0.5 * logf( (1.0+x)/(1.0-x) ); +	} +return( z ); +} | 
