]>
Commit | Line | Data |
---|---|---|
f7eac6eb RM |
1 | /* e_coshf.c -- float version of e_cosh.c. |
2 | * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. | |
0ac5ae23 | 3 | * Optimizations by Ulrich Drepper <drepper@gmail.com>, 2011 |
f7eac6eb RM |
4 | */ |
5 | ||
6 | /* | |
7 | * ==================================================== | |
8 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | |
9 | * | |
10 | * Developed at SunPro, a Sun Microsystems, Inc. business. | |
11 | * Permission to use, copy, modify, and distribute this | |
6bc31da0 | 12 | * software is freely granted, provided that this notice |
f7eac6eb RM |
13 | * is preserved. |
14 | * ==================================================== | |
15 | */ | |
16 | ||
f7eac6eb RM |
17 | #include "math.h" |
18 | #include "math_private.h" | |
19 | ||
6bc31da0 | 20 | static const float huge = 1.0e30; |
f7eac6eb | 21 | static const float one = 1.0, half=0.5; |
f7eac6eb | 22 | |
0ac5ae23 UD |
23 | float |
24 | __ieee754_coshf (float x) | |
6bc31da0 | 25 | { |
f7eac6eb RM |
26 | float t,w; |
27 | int32_t ix; | |
28 | ||
29 | GET_FLOAT_WORD(ix,x); | |
30 | ix &= 0x7fffffff; | |
31 | ||
0ac5ae23 | 32 | /* |x| in [0,22] */ |
f7eac6eb | 33 | if (ix < 0x41b00000) { |
0ac5ae23 UD |
34 | /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */ |
35 | if(ix<0x3eb17218) { | |
36 | t = __expm1f(fabsf(x)); | |
37 | w = one+t; | |
38 | if (ix<0x24000000) return w; /* cosh(tiny) = 1 */ | |
39 | return one+(t*t)/(w+w); | |
40 | } | |
41 | ||
42 | /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */ | |
f7eac6eb RM |
43 | t = __ieee754_expf(fabsf(x)); |
44 | return half*t+half/t; | |
45 | } | |
46 | ||
47 | /* |x| in [22, log(maxdouble)] return half*exp(|x|) */ | |
48 | if (ix < 0x42b17180) return half*__ieee754_expf(fabsf(x)); | |
49 | ||
50 | /* |x| in [log(maxdouble), overflowthresold] */ | |
51 | if (ix<=0x42b2d4fc) { | |
52 | w = __ieee754_expf(half*fabsf(x)); | |
53 | t = half*w; | |
54 | return t*w; | |
55 | } | |
56 | ||
0ac5ae23 UD |
57 | /* x is INF or NaN */ |
58 | if(ix>=0x7f800000) return x*x; | |
59 | ||
f7eac6eb RM |
60 | /* |x| > overflowthresold, cosh(x) overflow */ |
61 | return huge*huge; | |
62 | } | |
0ac5ae23 | 63 | strong_alias (__ieee754_coshf, __coshf_finite) |