xref: /freebsd/lib/msun/src/e_sinhf.c (revision 3a8617a83f16ffc9db4f96e1f0f21af94078e6b1)
13a8617a8SJordan K. Hubbard /* e_sinhf.c -- float version of e_sinh.c.
23a8617a8SJordan K. Hubbard  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
33a8617a8SJordan K. Hubbard  */
43a8617a8SJordan K. Hubbard 
53a8617a8SJordan K. Hubbard /*
63a8617a8SJordan K. Hubbard  * ====================================================
73a8617a8SJordan K. Hubbard  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
83a8617a8SJordan K. Hubbard  *
93a8617a8SJordan K. Hubbard  * Developed at SunPro, a Sun Microsystems, Inc. business.
103a8617a8SJordan K. Hubbard  * Permission to use, copy, modify, and distribute this
113a8617a8SJordan K. Hubbard  * software is freely granted, provided that this notice
123a8617a8SJordan K. Hubbard  * is preserved.
133a8617a8SJordan K. Hubbard  * ====================================================
143a8617a8SJordan K. Hubbard  */
153a8617a8SJordan K. Hubbard 
163a8617a8SJordan K. Hubbard #ifndef lint
173a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: e_sinhf.c,v 1.2 1994/08/18 23:06:04 jtc Exp $";
183a8617a8SJordan K. Hubbard #endif
193a8617a8SJordan K. Hubbard 
203a8617a8SJordan K. Hubbard #include "math.h"
213a8617a8SJordan K. Hubbard #include "math_private.h"
223a8617a8SJordan K. Hubbard 
233a8617a8SJordan K. Hubbard #ifdef __STDC__
243a8617a8SJordan K. Hubbard static const float one = 1.0, shuge = 1.0e37;
253a8617a8SJordan K. Hubbard #else
263a8617a8SJordan K. Hubbard static float one = 1.0, shuge = 1.0e37;
273a8617a8SJordan K. Hubbard #endif
283a8617a8SJordan K. Hubbard 
293a8617a8SJordan K. Hubbard #ifdef __STDC__
303a8617a8SJordan K. Hubbard 	float __ieee754_sinhf(float x)
313a8617a8SJordan K. Hubbard #else
323a8617a8SJordan K. Hubbard 	float __ieee754_sinhf(x)
333a8617a8SJordan K. Hubbard 	float x;
343a8617a8SJordan K. Hubbard #endif
353a8617a8SJordan K. Hubbard {
363a8617a8SJordan K. Hubbard 	float t,w,h;
373a8617a8SJordan K. Hubbard 	int32_t ix,jx;
383a8617a8SJordan K. Hubbard 
393a8617a8SJordan K. Hubbard 	GET_FLOAT_WORD(jx,x);
403a8617a8SJordan K. Hubbard 	ix = jx&0x7fffffff;
413a8617a8SJordan K. Hubbard 
423a8617a8SJordan K. Hubbard     /* x is INF or NaN */
433a8617a8SJordan K. Hubbard 	if(ix>=0x7f800000) return x+x;
443a8617a8SJordan K. Hubbard 
453a8617a8SJordan K. Hubbard 	h = 0.5;
463a8617a8SJordan K. Hubbard 	if (jx<0) h = -h;
473a8617a8SJordan K. Hubbard     /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
483a8617a8SJordan K. Hubbard 	if (ix < 0x41b00000) {		/* |x|<22 */
493a8617a8SJordan K. Hubbard 	    if (ix<0x31800000) 		/* |x|<2**-28 */
503a8617a8SJordan K. Hubbard 		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
513a8617a8SJordan K. Hubbard 	    t = expm1f(fabsf(x));
523a8617a8SJordan K. Hubbard 	    if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one));
533a8617a8SJordan K. Hubbard 	    return h*(t+t/(t+one));
543a8617a8SJordan K. Hubbard 	}
553a8617a8SJordan K. Hubbard 
563a8617a8SJordan K. Hubbard     /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */
573a8617a8SJordan K. Hubbard 	if (ix < 0x42b17180)  return h*__ieee754_expf(fabsf(x));
583a8617a8SJordan K. Hubbard 
593a8617a8SJordan K. Hubbard     /* |x| in [log(maxdouble), overflowthresold] */
603a8617a8SJordan K. Hubbard 	if (ix<=0x42b2d4fc) {
613a8617a8SJordan K. Hubbard 	    w = __ieee754_expf((float)0.5*fabsf(x));
623a8617a8SJordan K. Hubbard 	    t = h*w;
633a8617a8SJordan K. Hubbard 	    return t*w;
643a8617a8SJordan K. Hubbard 	}
653a8617a8SJordan K. Hubbard 
663a8617a8SJordan K. Hubbard     /* |x| > overflowthresold, sinh(x) overflow */
673a8617a8SJordan K. Hubbard 	return x*shuge;
683a8617a8SJordan K. Hubbard }
69