1 | /* e_coshf.c -- float version of e_cosh.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 | #ifndef lint
|
---|
17 | static char rcsid[] = "$FreeBSD: src/lib/msun/src/e_coshf.c,v 1.6 2002/05/28 17:03:12 alfred Exp $";
|
---|
18 | #endif
|
---|
19 |
|
---|
20 | #include "math.h"
|
---|
21 | #include "math_private.h"
|
---|
22 |
|
---|
23 | static const float one = 1.0, half=0.5, huge = 1.0e30;
|
---|
24 |
|
---|
25 | float
|
---|
26 | __ieee754_coshf(float x)
|
---|
27 | {
|
---|
28 | float t,w;
|
---|
29 | int32_t ix;
|
---|
30 |
|
---|
31 | GET_FLOAT_WORD(ix,x);
|
---|
32 | ix &= 0x7fffffff;
|
---|
33 |
|
---|
34 | /* x is INF or NaN */
|
---|
35 | if(ix>=0x7f800000) return x*x;
|
---|
36 |
|
---|
37 | /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
|
---|
38 | if(ix<0x3eb17218) {
|
---|
39 | t = expm1f(fabsf(x));
|
---|
40 | w = one+t;
|
---|
41 | if (ix<0x24000000) return w; /* cosh(tiny) = 1 */
|
---|
42 | return one+(t*t)/(w+w);
|
---|
43 | }
|
---|
44 |
|
---|
45 | /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
|
---|
46 | if (ix < 0x41b00000) {
|
---|
47 | t = __ieee754_expf(fabsf(x));
|
---|
48 | return half*t+half/t;
|
---|
49 | }
|
---|
50 |
|
---|
51 | /* |x| in [22, log(maxdouble)] return half*exp(|x|) */
|
---|
52 | if (ix < 0x42b17180) return half*__ieee754_expf(fabsf(x));
|
---|
53 |
|
---|
54 | /* |x| in [log(maxdouble), overflowthresold] */
|
---|
55 | if (ix<=0x42b2d4fc) {
|
---|
56 | w = __ieee754_expf(half*fabsf(x));
|
---|
57 | t = half*w;
|
---|
58 | return t*w;
|
---|
59 | }
|
---|
60 |
|
---|
61 | /* |x| > overflowthresold, cosh(x) overflow */
|
---|
62 | return huge*huge;
|
---|
63 | }
|
---|