t2ex/bsd_source/lib/libc/src_bsd/math/e_sinhf.c | bare source | permlink (0.02 seconds) |
1: /* e_sinhf.c -- float version of e_sinh.c. 2: * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 3: */ 4: 5: /* 6: * ==================================================== 7: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 8: * 9: * Developed at SunPro, a Sun Microsystems, Inc. business. 10: * Permission to use, copy, modify, and distribute this 11: * software is freely granted, provided that this notice 12: * is preserved. 13: * ==================================================== 14: */ 15: 16: #include "math.h" 17: #include "math_private.h" 18: 19: static const float one = 1.0, shuge = 1.0e37; 20: 21: float 22: sinhf(float x) 23: { 24: float t,w,h; 25: int32_t ix,jx; 26: 27: GET_FLOAT_WORD(jx,x); 28: ix = jx&0x7fffffff; 29: 30: /* x is INF or NaN */ 31: if(ix>=0x7f800000) return x+x; 32: 33: h = 0.5; 34: if (jx<0) h = -h; 35: /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */ 36: if (ix < 0x41b00000) { /* |x|<22 */ 37: if (ix<0x31800000) /* |x|<2**-28 */ 38: if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */ 39: t = expm1f(fabsf(x)); 40: if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one)); 41: return h*(t+t/(t+one)); 42: } 43: 44: /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */ 45: if (ix < 0x42b17180) return h*expf(fabsf(x)); 46: 47: /* |x| in [log(maxdouble), overflowthresold] */ 48: if (ix<=0x42b2d4fc) { 49: w = expf((float)0.5*fabsf(x)); 50: t = h*w; 51: return t*w; 52: } 53: 54: /* |x| > overflowthresold, sinh(x) overflow */ 55: return x*shuge; 56: }