xref: /freebsd/lib/msun/src/e_sinhf.c (revision d4657ac79968f78c6ca8488204581a93f5c10ce5)
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 
165aa554c7SDavid Schultz #include <sys/cdefs.h>
175aa554c7SDavid Schultz __FBSDID("$FreeBSD$");
183a8617a8SJordan K. Hubbard 
193a8617a8SJordan K. Hubbard #include "math.h"
203a8617a8SJordan K. Hubbard #include "math_private.h"
213a8617a8SJordan K. Hubbard 
223a8617a8SJordan K. Hubbard static const float one = 1.0, shuge = 1.0e37;
233a8617a8SJordan K. Hubbard 
2459b19ff1SAlfred Perlstein float
2559b19ff1SAlfred Perlstein __ieee754_sinhf(float x)
263a8617a8SJordan K. Hubbard {
27*d4657ac7SDavid Schultz 	float t,h;
283a8617a8SJordan K. Hubbard 	int32_t ix,jx;
293a8617a8SJordan K. Hubbard 
303a8617a8SJordan K. Hubbard 	GET_FLOAT_WORD(jx,x);
313a8617a8SJordan K. Hubbard 	ix = jx&0x7fffffff;
323a8617a8SJordan K. Hubbard 
333a8617a8SJordan K. Hubbard     /* x is INF or NaN */
343a8617a8SJordan K. Hubbard 	if(ix>=0x7f800000) return x+x;
353a8617a8SJordan K. Hubbard 
363a8617a8SJordan K. Hubbard 	h = 0.5;
373a8617a8SJordan K. Hubbard 	if (jx<0) h = -h;
3825efbfb2SBruce Evans     /* |x| in [0,9], return sign(x)*0.5*(E+E/(E+1))) */
3925efbfb2SBruce Evans 	if (ix < 0x41100000) {		/* |x|<9 */
4025efbfb2SBruce Evans 	    if (ix<0x39800000) 		/* |x|<2**-12 */
413a8617a8SJordan K. Hubbard 		if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
423a8617a8SJordan K. Hubbard 	    t = expm1f(fabsf(x));
433a8617a8SJordan K. Hubbard 	    if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one));
443a8617a8SJordan K. Hubbard 	    return h*(t+t/(t+one));
453a8617a8SJordan K. Hubbard 	}
463a8617a8SJordan K. Hubbard 
4725efbfb2SBruce Evans     /* |x| in [9, logf(maxfloat)] return 0.5*exp(|x|) */
4825efbfb2SBruce Evans 	if (ix < 0x42b17217)  return h*__ieee754_expf(fabsf(x));
493a8617a8SJordan K. Hubbard 
5025efbfb2SBruce Evans     /* |x| in [logf(maxfloat), overflowthresold] */
51*d4657ac7SDavid Schultz 	if (ix<=0x42b2d4fc)
52*d4657ac7SDavid Schultz 	    return h*2.0F*__ldexp_expf(fabsf(x), -1);
533a8617a8SJordan K. Hubbard 
543a8617a8SJordan K. Hubbard     /* |x| > overflowthresold, sinh(x) overflow */
553a8617a8SJordan K. Hubbard 	return x*shuge;
563a8617a8SJordan K. Hubbard }
57