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