xref: /freebsd/lib/msun/src/e_sinhf.c (revision 0dd5a5603e7a33d976f8e6015620bbc79839c609)
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 #include "math.h"
173a8617a8SJordan K. Hubbard #include "math_private.h"
183a8617a8SJordan K. Hubbard 
193a8617a8SJordan K. Hubbard static const float one = 1.0, shuge = 1.0e37;
203a8617a8SJordan K. Hubbard 
2159b19ff1SAlfred Perlstein float
sinhf(float x)22*99843eb8SSteve Kargl sinhf(float x)
233a8617a8SJordan K. Hubbard {
24d4657ac7SDavid Schultz 	float t,h;
253a8617a8SJordan K. Hubbard 	int32_t ix,jx;
263a8617a8SJordan K. Hubbard 
273a8617a8SJordan K. Hubbard 	GET_FLOAT_WORD(jx,x);
283a8617a8SJordan K. Hubbard 	ix = jx&0x7fffffff;
293a8617a8SJordan K. Hubbard 
303a8617a8SJordan K. Hubbard     /* x is INF or NaN */
313a8617a8SJordan K. Hubbard 	if(ix>=0x7f800000) return x+x;
323a8617a8SJordan K. Hubbard 
333a8617a8SJordan K. Hubbard 	h = 0.5;
343a8617a8SJordan K. Hubbard 	if (jx<0) h = -h;
3525efbfb2SBruce Evans     /* |x| in [0,9], return sign(x)*0.5*(E+E/(E+1))) */
3625efbfb2SBruce Evans 	if (ix < 0x41100000) {		/* |x|<9 */
3725efbfb2SBruce Evans 	    if (ix<0x39800000) 		/* |x|<2**-12 */
383a8617a8SJordan K. Hubbard 		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
393a8617a8SJordan K. Hubbard 	    t = expm1f(fabsf(x));
403a8617a8SJordan K. Hubbard 	    if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one));
413a8617a8SJordan K. Hubbard 	    return h*(t+t/(t+one));
423a8617a8SJordan K. Hubbard 	}
433a8617a8SJordan K. Hubbard 
4425efbfb2SBruce Evans     /* |x| in [9, logf(maxfloat)] return 0.5*exp(|x|) */
45*99843eb8SSteve Kargl 	if (ix < 0x42b17217)  return h*expf(fabsf(x));
463a8617a8SJordan K. Hubbard 
4725efbfb2SBruce Evans     /* |x| in [logf(maxfloat), overflowthresold] */
48d4657ac7SDavid Schultz 	if (ix<=0x42b2d4fc)
49d4657ac7SDavid Schultz 	    return h*2.0F*__ldexp_expf(fabsf(x), -1);
503a8617a8SJordan K. Hubbard 
513a8617a8SJordan K. Hubbard     /* |x| > overflowthresold, sinh(x) overflow */
523a8617a8SJordan K. Hubbard 	return x*shuge;
533a8617a8SJordan K. Hubbard }
54