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 __ctanhl = ctanhl
32 #include "libm.h" /* expl/expm1l/fabsl/isinfl/isnanl/sincosl/sinl/tanhl */
33 #include "complex_wrapper.h"
34 #include "longdouble.h"
37 static const long double four
= 4.0L, two
= 2.0L, one
= 1.0L, zero
= 0.0L;
42 long double r
, u
, v
, t
, x
, y
, S
, C
;
55 if (y
== zero
) { /* ctanh(x,0) = (x,0) for x = 0 or NaN */
56 LD_RE(ans
) = tanhl(x
);
58 } else if (iy
>= 0x7fff0000) { /* y is inf or NaN */
59 if (ix
< 0x7fff0000) /* catanh(finite x,inf/nan) is nan */
60 LD_RE(ans
) = LD_IM(ans
) = y
- y
;
61 else if (isinfl(x
)) { /* x is inf */
68 } else if (ix
>= 0x4004e000) {
71 * |x| > 60 = prec/2 (14,28,34,60)
72 * ctanh z ~ 1 + i (sin2y)/(exp(2x))
76 if (iy
< 0x7ffe0000) /* t = sin(2y) */
79 (void) sincosl(y
, &S
, &C
);
82 if (ix
>= 0x7ffe0000) { /* |x| > max/2 */
83 if (ix
>= 0x7fff0000) { /* |x| is inf or NaN */
84 if (isnanl(x
)) /* x is NaN */
85 LD_RE(ans
) = LD_IM(ans
) = x
+ y
;
87 LD_IM(ans
) = zero
* S
; /* x is inf */
89 LD_IM(ans
) = S
* expl(-x
); /* underflow */
91 LD_IM(ans
) = (S
+ S
) * expl(-(x
+ x
));
92 /* 2 sin 2y / exp(2x) */
97 * ctanh z = ---------------------------
98 * t*t+[4(t+1)(cos y)](cos y)
100 * [4(t+1)(cos y)]*(sin y)
101 * i --------------------------
102 * t*t+[4(t+1)(cos y)](cos y)
107 r
= (four
* C
) * (t
+ one
);
109 v
= one
/ (u
+ r
* C
);
110 LD_RE(ans
) = (u
+ two
* t
) * v
;
111 LD_IM(ans
) = (r
* S
) * v
;
114 LD_RE(ans
) = -LD_RE(ans
);
116 LD_IM(ans
) = -LD_IM(ans
);