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