]>
Commit | Line | Data |
---|---|---|
993b3242 UD |
1 | /* Complex sine hyperbole function for long double. |
2 | Copyright (C) 1997 Free Software Foundation, Inc. | |
3 | This file is part of the GNU C Library. | |
4 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. | |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
7 | modify it under the terms of the GNU Library General Public License as | |
8 | published by the Free Software Foundation; either version 2 of the | |
9 | License, or (at your option) any later version. | |
10 | ||
11 | The GNU C Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | Library General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU Library General Public | |
17 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
18 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 | Boston, MA 02111-1307, USA. */ | |
20 | ||
21 | #include <complex.h> | |
22 | #include <math.h> | |
23 | ||
63551311 UD |
24 | #include "math_private.h" |
25 | ||
993b3242 UD |
26 | |
27 | __complex__ long double | |
28 | __csinhl (__complex__ long double x) | |
29 | { | |
30 | __complex__ long double retval; | |
31 | int negate = signbit (__real__ x); | |
63551311 UD |
32 | int rcls = fpclassify (__real__ x); |
33 | int icls = fpclassify (__imag__ x); | |
993b3242 | 34 | |
63551311 | 35 | __real__ x = fabsl (__real__ x); |
993b3242 | 36 | |
63551311 | 37 | if (rcls >= FP_ZERO) |
993b3242 | 38 | { |
63551311 UD |
39 | /* Real part is finite. */ |
40 | if (icls >= FP_ZERO) | |
993b3242 | 41 | { |
63551311 UD |
42 | /* Imaginary part is finite. */ |
43 | long double sinh_val = __ieee754_sinhl (__real__ x); | |
779ae82e | 44 | long double cosh_val = __ieee754_coshl (__real__ x); |
7799b7b3 | 45 | long double sinix, cosix; |
993b3242 | 46 | |
7799b7b3 UD |
47 | __sincosl (__imag__ x, &sinix, &cosix); |
48 | ||
49 | __real__ retval = sinh_val * cosix; | |
779ae82e | 50 | __imag__ retval = cosh_val * sinix; |
993b3242 UD |
51 | |
52 | if (negate) | |
53 | __real__ retval = -__real__ retval; | |
54 | } | |
55 | else | |
56 | { | |
63551311 | 57 | if (rcls == FP_ZERO) |
993b3242 | 58 | { |
63551311 | 59 | /* Real part is 0.0. */ |
993b3242 UD |
60 | __real__ retval = __copysignl (0.0, negate ? -1.0 : 1.0); |
61 | __imag__ retval = __nanl ("") + __nanl (""); | |
779ae82e UD |
62 | |
63 | #ifdef FE_INVALID | |
64 | if (icls == FP_INFINITE) | |
65 | feraiseexcept (FE_INVALID); | |
66 | #endif | |
993b3242 UD |
67 | } |
68 | else | |
69 | { | |
70 | __real__ retval = __nanl (""); | |
71 | __imag__ retval = __nanl (""); | |
779ae82e UD |
72 | |
73 | #ifdef FE_INVALID | |
74 | feraiseexcept (FE_INVALID); | |
75 | #endif | |
993b3242 UD |
76 | } |
77 | } | |
78 | } | |
63551311 | 79 | else if (rcls == FP_INFINITE) |
993b3242 | 80 | { |
63551311 UD |
81 | /* Real part is infinite. */ |
82 | if (icls == FP_ZERO) | |
993b3242 | 83 | { |
63551311 | 84 | /* Imaginary part is 0.0. */ |
993b3242 UD |
85 | __real__ retval = negate ? -HUGE_VALL : HUGE_VALL; |
86 | __imag__ retval = __imag__ x; | |
87 | } | |
63551311 | 88 | else if (icls > FP_ZERO) |
993b3242 | 89 | { |
63551311 | 90 | /* Imaginary part is finite. */ |
7799b7b3 UD |
91 | long double sinix, cosix; |
92 | ||
93 | __sincosl (__imag__ x, &sinix, &cosix); | |
94 | ||
95 | __real__ retval = __copysignl (HUGE_VALL, cosix); | |
96 | __imag__ retval = __copysignl (HUGE_VALL, sinix); | |
993b3242 UD |
97 | |
98 | if (negate) | |
99 | __real__ retval = -__real__ retval; | |
100 | } | |
101 | else | |
102 | { | |
103 | /* The addition raises the invalid exception. */ | |
104 | __real__ retval = HUGE_VALL; | |
105 | __imag__ retval = __nanl ("") + __nanl (""); | |
779ae82e UD |
106 | |
107 | #ifdef FE_INVALID | |
108 | if (icls == FP_INFINITE) | |
109 | feraiseexcept (FE_INVALID); | |
110 | #endif | |
993b3242 UD |
111 | } |
112 | } | |
113 | else | |
114 | { | |
63551311 UD |
115 | __real__ retval = __nanl (""); |
116 | __imag__ retval = __imag__ x == 0.0 ? __imag__ x : __nanl (""); | |
993b3242 UD |
117 | } |
118 | ||
119 | return retval; | |
120 | } | |
121 | weak_alias (__csinhl, csinhl) |