4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #pragma weak __coshl = coshl
33 #include "longdouble.h"
37 * RETURN THE HYPERBOLIC COSINE OF X
40 * 1. Replace x by |x| (COSH(x) = COSH(-x)).
43 * 0 <= x <= 0.3465 : COSH(x) := 1 + -------------------
47 * 0.3465 <= x <= thresh : COSH(x) := -------------------
49 * thresh <= x <= lnovft : COSH(x) := EXP(x)/2
50 * lnovft <= x < INF : COSH(x) := SCALBN(EXP(x-MEP1*ln2),ME)
54 * 0.3465 a number that is near one half of ln2.
55 * thresh a number such that
56 * EXP(thresh)+EXP(-thresh)=EXP(thresh)
57 * lnovft logarithm of the overflow threshold
58 * = MEP1*ln2 chopped to machine precision.
60 * MEP1 maximum exponent plus 1
63 * COSH(x) is |x| if x is +INF, -INF, or NaN.
64 * only COSH(0)=1 is exact for finite x.
67 static const long double C
[] = {
72 1.135652340629414394879149e+04L,
73 7.004447686242549087858985e-16L,
74 2.710505431213761085018632e-20L, /* 2^-65 */
86 coshl(long double x
) {
91 return (w
+ w
); /* x is INF or NaN */
94 return (one
+ w
); /* inexact+directed rounding */
97 w
= one
+ (t
* t
) / (w
+ w
);
102 return (half
* (t
+ one
/ t
));
105 return (half
* expl(w
));
106 return (scalbnl(expl((w
- lnovft
) - lnovlo
), 16383));