123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* 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 );
- }
|