]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/libm-ieee754/s_csinhl.c
Update.
[thirdparty/glibc.git] / sysdeps / libm-ieee754 / s_csinhl.c
CommitLineData
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}
121weak_alias (__csinhl, csinhl)