diff options
Diffstat (limited to 'libm/float/sinhf.c')
| -rw-r--r-- | libm/float/sinhf.c | 87 | 
1 files changed, 87 insertions, 0 deletions
| diff --git a/libm/float/sinhf.c b/libm/float/sinhf.c new file mode 100644 index 000000000..e8baaf4fa --- /dev/null +++ b/libm/float/sinhf.c @@ -0,0 +1,87 @@ +/*							sinhf.c + * + *	Hyperbolic sine + * + * + * + * SYNOPSIS: + * + * float x, y, sinhf(); + * + * y = sinhf( x ); + * + * + * + * DESCRIPTION: + * + * Returns hyperbolic sine of argument in the range MINLOGF to + * MAXLOGF. + * + * The range is partitioned into two segments.  If |x| <= 1, a + * polynomial approximation is used. + * Otherwise the calculation is sinh(x) = ( exp(x) - exp(-x) )/2. + * + * + * + * ACCURACY: + * + *                      Relative error: + * arithmetic   domain     # trials      peak         rms + *    IEEE     +-MAXLOG     100000      1.1e-7      2.9e-8 + * + */ + +/* +Cephes Math Library Release 2.2:  June, 1992 +Copyright 1984, 1987, 1989, 1992 by Stephen L. Moshier +Direct inquiries to 30 Frost Street, Cambridge, MA 02140 +*/ + +/* Single precision hyperbolic sine + * test interval: [-1, +1] + * trials: 10000 + * peak relative error: 9.0e-8 + * rms relative error: 3.0e-8 + */ +#include <math.h> +extern float MAXLOGF, MAXNUMF; + +float expf( float ); + +float sinhf( float xx ) +{ +register float z; +float x; + +x = xx; +if( xx < 0 ) +	z = -x; +else +	z = x; + +if( z > MAXLOGF ) +	{ +	mtherr( "sinhf", DOMAIN ); +	if( x > 0 ) +		return( MAXNUMF ); +	else +		return( -MAXNUMF ); +	} +if( z > 1.0 ) +	{ +	z = expf(z); +	z = 0.5*z - (0.5/z); +	if( x < 0 ) +		z = -z; +	} +else +	{ +	z = x * x; +	z = +	(( 2.03721912945E-4 * z +	  + 8.33028376239E-3) * z +	  + 1.66667160211E-1) * z * x +	  + x; +	} +return( z ); +} | 
