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