]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/s_cexp.c
Moved to csu/errno-loc.c.
[thirdparty/glibc.git] / math / s_cexp.c
CommitLineData
7799b7b3 1/* Return value of complex exponential function for double complex value.
34b402e5
UD
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
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.
34b402e5
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.
34b402e5 15
41bdb6e2
AJ
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA. */
34b402e5
UD
20
21#include <complex.h>
93256cc1 22#include <fenv.h>
34b402e5
UD
23#include <math.h>
24
7799b7b3
UD
25#include "math_private.h"
26
34b402e5
UD
27
28__complex__ double
29__cexp (__complex__ double x)
30{
31 __complex__ double retval;
7799b7b3
UD
32 int rcls = fpclassify (__real__ x);
33 int icls = fpclassify (__imag__ x);
34b402e5 34
7799b7b3 35 if (rcls >= FP_ZERO)
34b402e5 36 {
7799b7b3
UD
37 /* Real part is finite. */
38 if (icls >= FP_ZERO)
34b402e5 39 {
7799b7b3
UD
40 /* Imaginary part is finite. */
41 double exp_val = __ieee754_exp (__real__ x);
dd33e89f
UD
42 double sinix, cosix;
43
44 __sincos (__imag__ x, &sinix, &cosix);
993b3242 45
5929563f
UD
46 if (isfinite (exp_val))
47 {
dd33e89f
UD
48 __real__ retval = exp_val * cosix;
49 __imag__ retval = exp_val * sinix;
5929563f
UD
50 }
51 else
52 {
dd33e89f
UD
53 __real__ retval = __copysign (exp_val, cosix);
54 __imag__ retval = __copysign (exp_val, sinix);
5929563f 55 }
34b402e5
UD
56 }
57 else
993b3242
UD
58 {
59 /* If the imaginary part is +-inf or NaN and the real part
60 is not +-inf the result is NaN + iNaN. */
61 __real__ retval = __nan ("");
62 __imag__ retval = __nan ("");
93256cc1
UD
63
64#ifdef FE_INVALID
65 feraiseexcept (FE_INVALID);
66#endif
993b3242 67 }
34b402e5 68 }
7799b7b3 69 else if (rcls == FP_INFINITE)
34b402e5 70 {
7799b7b3
UD
71 /* Real part is infinite. */
72 if (icls >= FP_ZERO)
34b402e5 73 {
7799b7b3 74 /* Imaginary part is finite. */
5929563f
UD
75 double value = signbit (__real__ x) ? 0.0 : HUGE_VAL;
76
7799b7b3 77 if (icls == FP_ZERO)
5929563f 78 {
7799b7b3 79 /* Imaginary part is 0.0. */
5929563f
UD
80 __real__ retval = value;
81 __imag__ retval = __imag__ x;
82 }
34b402e5 83 else
993b3242 84 {
dd33e89f
UD
85 double sinix, cosix;
86
87 __sincos (__imag__ x, &sinix, &cosix);
88
89 __real__ retval = __copysign (value, cosix);
90 __imag__ retval = __copysign (value, sinix);
993b3242
UD
91 }
92 }
93 else if (signbit (__real__ x) == 0)
94 {
95 __real__ retval = HUGE_VAL;
96 __imag__ retval = __nan ("");
93256cc1
UD
97
98#ifdef FE_INVALID
99 if (icls == FP_INFINITE)
100 feraiseexcept (FE_INVALID);
101#endif
34b402e5 102 }
34b402e5 103 else
5929563f
UD
104 {
105 __real__ retval = 0.0;
106 __imag__ retval = __copysign (0.0, __imag__ x);
107 }
34b402e5
UD
108 }
109 else
993b3242
UD
110 {
111 /* If the real part is NaN the result is NaN + iNaN. */
112 __real__ retval = __nan ("");
113 __imag__ retval = __nan ("");
93256cc1
UD
114
115#ifdef FE_INVALID
116 if (rcls != FP_NAN || icls != FP_NAN)
117 feraiseexcept (FE_INVALID);
118#endif
993b3242 119 }
34b402e5
UD
120
121 return retval;
122}
123weak_alias (__cexp, cexp)
993b3242 124#ifdef NO_LONG_DOUBLE
c131718c 125strong_alias (__cexp, __cexpl)
993b3242
UD
126weak_alias (__cexp, cexpl)
127#endif