Remove "Contributed by" lines
[platform/upstream/glibc.git] / math / s_csinh_template.c
1 /* Complex sine hyperbole function for float types.
2    Copyright (C) 1997-2021 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18
19 #include <complex.h>
20 #include <fenv.h>
21 #include <math.h>
22 #include <math_private.h>
23 #include <math-underflow.h>
24 #include <float.h>
25
26 CFLOAT
27 M_DECL_FUNC (__csinh) (CFLOAT x)
28 {
29   CFLOAT retval;
30   int negate = signbit (__real__ x);
31   int rcls = fpclassify (__real__ x);
32   int icls = fpclassify (__imag__ x);
33
34   __real__ x = M_FABS (__real__ x);
35
36   if (__glibc_likely (rcls >= FP_ZERO))
37     {
38       /* Real part is finite.  */
39       if (__glibc_likely (icls >= FP_ZERO))
40         {
41           /* Imaginary part is finite.  */
42           const int t = (int) ((M_MAX_EXP - 1) * M_MLIT (M_LN2));
43           FLOAT sinix, cosix;
44
45           if (__glibc_likely (M_FABS (__imag__ x) > M_MIN))
46             {
47               M_SINCOS (__imag__ x, &sinix, &cosix);
48             }
49           else
50             {
51               sinix = __imag__ x;
52               cosix = 1;
53             }
54
55           if (negate)
56             cosix = -cosix;
57
58           if (M_FABS (__real__ x) > t)
59             {
60               FLOAT exp_t = M_EXP (t);
61               FLOAT rx = M_FABS (__real__ x);
62               if (signbit (__real__ x))
63                 cosix = -cosix;
64               rx -= t;
65               sinix *= exp_t / 2;
66               cosix *= exp_t / 2;
67               if (rx > t)
68                 {
69                   rx -= t;
70                   sinix *= exp_t;
71                   cosix *= exp_t;
72                 }
73               if (rx > t)
74                 {
75                   /* Overflow (original real part of x > 3t).  */
76                   __real__ retval = M_MAX * cosix;
77                   __imag__ retval = M_MAX * sinix;
78                 }
79               else
80                 {
81                   FLOAT exp_val = M_EXP (rx);
82                   __real__ retval = exp_val * cosix;
83                   __imag__ retval = exp_val * sinix;
84                 }
85             }
86           else
87             {
88               __real__ retval = M_SINH (__real__ x) * cosix;
89               __imag__ retval = M_COSH (__real__ x) * sinix;
90             }
91
92           math_check_force_underflow_complex (retval);
93         }
94       else
95         {
96           if (rcls == FP_ZERO)
97             {
98               /* Real part is 0.0.  */
99               __real__ retval = M_COPYSIGN (0, negate ? -1 : 1);
100               __imag__ retval = __imag__ x - __imag__ x;
101             }
102           else
103             {
104               __real__ retval = M_NAN;
105               __imag__ retval = M_NAN;
106
107               feraiseexcept (FE_INVALID);
108             }
109         }
110     }
111   else if (rcls == FP_INFINITE)
112     {
113       /* Real part is infinite.  */
114       if (__glibc_likely (icls > FP_ZERO))
115         {
116           /* Imaginary part is finite.  */
117           FLOAT sinix, cosix;
118
119           if (__glibc_likely (M_FABS (__imag__ x) > M_MIN))
120             {
121               M_SINCOS (__imag__ x, &sinix, &cosix);
122             }
123           else
124             {
125               sinix = __imag__ x;
126               cosix = 1;
127             }
128
129           __real__ retval = M_COPYSIGN (M_HUGE_VAL, cosix);
130           __imag__ retval = M_COPYSIGN (M_HUGE_VAL, sinix);
131
132           if (negate)
133             __real__ retval = -__real__ retval;
134         }
135       else if (icls == FP_ZERO)
136         {
137           /* Imaginary part is 0.0.  */
138           __real__ retval = negate ? -M_HUGE_VAL : M_HUGE_VAL;
139           __imag__ retval = __imag__ x;
140         }
141       else
142         {
143           __real__ retval = M_HUGE_VAL;
144           __imag__ retval = __imag__ x - __imag__ x;
145         }
146     }
147   else
148     {
149       __real__ retval = M_NAN;
150       __imag__ retval = __imag__ x == 0 ? __imag__ x : M_NAN;
151     }
152
153   return retval;
154 }
155
156 declare_mgen_alias (__csinh, csinh)