source: trunk/libs/newlib/src/newlib/libm/math/ef_sinh.c @ 567

Last change on this file since 567 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.6 KB
Line 
1/* ef_sinh.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 "fdlibm.h"
17
18#ifdef __STDC__
19static const float one = 1.0, shuge = 1.0e37;
20#else
21static float one = 1.0, shuge = 1.0e37;
22#endif
23
24#ifdef __STDC__
25        float __ieee754_sinhf(float x)
26#else
27        float __ieee754_sinhf(x)
28        float x;
29#endif
30{       
31        float t,w,h;
32        __int32_t ix,jx;
33
34        GET_FLOAT_WORD(jx,x);
35        ix = jx&0x7fffffff;
36
37    /* x is INF or NaN */
38        if(!FLT_UWORD_IS_FINITE(ix)) return x+x;       
39
40        h = 0.5;
41        if (jx<0) h = -h;
42    /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
43        if (ix < 0x41b00000) {          /* |x|<22 */
44            if (ix<0x31800000)          /* |x|<2**-28 */
45                if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
46            t = expm1f(fabsf(x));
47            if(ix<0x3f800000) return h*((float)2.0*t-t*t/(t+one));
48            return h*(t+t/(t+one));
49        }
50
51    /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */
52        if (ix<=FLT_UWORD_LOG_MAX)  return h*__ieee754_expf(fabsf(x));
53
54    /* |x| in [log(maxdouble), overflowthresold] */
55        if (ix<=FLT_UWORD_LOG_2MAX) {
56            w = __ieee754_expf((float)0.5*fabsf(x));
57            t = h*w;
58            return t*w;
59        }
60
61    /* |x| > overflowthresold, sinh(x) overflow */
62        return x*shuge;
63}
Note: See TracBrowser for help on using the repository browser.