]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/s_csinf.c
Replace FSF snail mail address with URLs.
[thirdparty/glibc.git] / math / s_csinf.c
CommitLineData
63551311 1/* Complex sine function for float.
bc62c2fb 2 Copyright (C) 1997, 2011 Free Software Foundation, Inc.
63551311
UD
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
41bdb6e2
AJ
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
63551311
UD
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
41bdb6e2 14 Lesser General Public License for more details.
63551311 15
41bdb6e2 16 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
63551311
UD
19
20#include <complex.h>
779ae82e 21#include <fenv.h>
63551311
UD
22#include <math.h>
23
9277c064 24#include <math_private.h>
779ae82e 25
63551311
UD
26
27__complex__ float
28__csinf (__complex__ float x)
29{
779ae82e
UD
30 __complex__ float retval;
31 int negate = signbit (__real__ x);
32 int rcls = fpclassify (__real__ x);
33 int icls = fpclassify (__imag__ x);
34
35 __real__ x = fabsf (__real__ x);
63551311 36
bc62c2fb 37 if (__builtin_expect (icls >= FP_ZERO, 1))
63551311 38 {
779ae82e 39 /* Imaginary part is finite. */
bc62c2fb 40 if (__builtin_expect (rcls >= FP_ZERO, 1))
63551311 41 {
779ae82e
UD
42 /* Real part is finite. */
43 float sinh_val = __ieee754_sinhf (__imag__ x);
44 float cosh_val = __ieee754_coshf (__imag__ x);
45 float sinix, cosix;
46
47 __sincosf (__real__ x, &sinix, &cosix);
48
49 __real__ retval = cosh_val * sinix;
50 __imag__ retval = sinh_val * cosix;
51
52 if (negate)
53 __real__ retval = -__real__ retval;
63551311
UD
54 }
55 else
56 {
779ae82e
UD
57 if (icls == FP_ZERO)
58 {
59 /* Imaginary part is 0.0. */
60 __real__ retval = __nanf ("");
61 __imag__ retval = __imag__ x;
62
779ae82e
UD
63 if (rcls == FP_INFINITE)
64 feraiseexcept (FE_INVALID);
779ae82e
UD
65 }
66 else
67 {
68 __real__ retval = __nanf ("");
69 __imag__ retval = __nanf ("");
70
779ae82e 71 feraiseexcept (FE_INVALID);
779ae82e 72 }
63551311
UD
73 }
74 }
779ae82e 75 else if (icls == FP_INFINITE)
63551311 76 {
779ae82e
UD
77 /* Imaginary part is infinite. */
78 if (rcls == FP_ZERO)
79 {
80 /* Real part is 0.0. */
81 __real__ retval = __copysignf (0.0, negate ? -1.0 : 1.0);
82 __imag__ retval = __imag__ x;
83 }
84 else if (rcls > FP_ZERO)
85 {
86 /* Real part is finite. */
87 float sinix, cosix;
88
89 __sincosf (__real__ x, &sinix, &cosix);
63551311 90
779ae82e
UD
91 __real__ retval = __copysignf (HUGE_VALF, sinix);
92 __imag__ retval = __copysignf (HUGE_VALF, cosix);
63551311 93
779ae82e
UD
94 if (negate)
95 __real__ retval = -__real__ retval;
96 if (signbit (__imag__ x))
97 __imag__ retval = -__imag__ retval;
98 }
99 else
100 {
101 /* The addition raises the invalid exception. */
102 __real__ retval = __nanf ("");
103 __imag__ retval = HUGE_VALF;
63551311 104
779ae82e
UD
105 if (rcls == FP_INFINITE)
106 feraiseexcept (FE_INVALID);
779ae82e
UD
107 }
108 }
109 else
110 {
111 if (rcls == FP_ZERO)
112 __real__ retval = __copysignf (0.0, negate ? -1.0 : 1.0);
113 else
114 __real__ retval = __nanf ("");
115 __imag__ retval = __nanf ("");
63551311
UD
116 }
117
779ae82e 118 return retval;
63551311 119}
1705f0a3 120#ifndef __csinf
63551311 121weak_alias (__csinf, csinf)
1705f0a3 122#endif