]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/s_clog.c
Fix trailing space.
[thirdparty/glibc.git] / math / s_clog.c
CommitLineData
c131718c 1/* Compute complex natural logarithm.
b168057a 2 Copyright (C) 1997-2015 Free Software Foundation, Inc.
c131718c
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.
c131718c
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.
c131718c 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/>. */
c131718c
UD
19
20#include <complex.h>
21#include <math.h>
9277c064 22#include <math_private.h>
1897ad44 23#include <float.h>
c131718c
UD
24
25__complex__ double
26__clog (__complex__ double x)
27{
28 __complex__ double result;
63551311
UD
29 int rcls = fpclassify (__real__ x);
30 int icls = fpclassify (__imag__ x);
c131718c 31
a1ffb40e 32 if (__glibc_unlikely (rcls == FP_ZERO && icls == FP_ZERO))
c131718c 33 {
63551311 34 /* Real and imaginary part are 0.0. */
c131718c 35 __imag__ result = signbit (__real__ x) ? M_PI : 0.0;
63551311 36 __imag__ result = __copysign (__imag__ result, __imag__ x);
c131718c
UD
37 /* Yes, the following line raises an exception. */
38 __real__ result = -1.0 / fabs (__real__ x);
39 }
a1ffb40e 40 else if (__glibc_likely (rcls != FP_NAN && icls != FP_NAN))
c131718c 41 {
63551311 42 /* Neither real nor imaginary part is NaN. */
638a572e 43 double absx = fabs (__real__ x), absy = fabs (__imag__ x);
1897ad44
JM
44 int scale = 0;
45
da865e95
JM
46 if (absx < absy)
47 {
48 double t = absx;
49 absx = absy;
50 absy = t;
51 }
52
638a572e 53 if (absx > DBL_MAX / 2.0)
1897ad44
JM
54 {
55 scale = -1;
638a572e
JM
56 absx = __scalbn (absx, scale);
57 absy = (absy >= DBL_MIN * 2.0 ? __scalbn (absy, scale) : 0.0);
1897ad44 58 }
638a572e 59 else if (absx < DBL_MIN && absy < DBL_MIN)
1897ad44
JM
60 {
61 scale = DBL_MANT_DIG;
638a572e
JM
62 absx = __scalbn (absx, scale);
63 absy = __scalbn (absy, scale);
1897ad44
JM
64 }
65
da865e95
JM
66 if (absx == 1.0 && scale == 0)
67 {
68 double absy2 = absy * absy;
69 if (absy2 <= DBL_MIN * 2.0)
70 {
6f05bafe
JM
71 double force_underflow = absy2 * absy2;
72 __real__ result = absy2 / 2.0;
73 math_force_eval (force_underflow);
da865e95
JM
74 }
75 else
76 __real__ result = __log1p (absy2) / 2.0;
77 }
d0419dbf
JM
78 else if (absx > 1.0 && absx < 2.0 && absy < 1.0 && scale == 0)
79 {
80 double d2m1 = (absx - 1.0) * (absx + 1.0);
81 if (absy >= DBL_EPSILON)
82 d2m1 += absy * absy;
83 __real__ result = __log1p (d2m1) / 2.0;
84 }
d032e0d2
JM
85 else if (absx < 1.0
86 && absx >= 0.75
87 && absy < DBL_EPSILON / 2.0
88 && scale == 0)
89 {
90 double d2m1 = (absx - 1.0) * (absx + 1.0);
91 __real__ result = __log1p (d2m1) / 2.0;
92 }
93 else if (absx < 1.0 && (absx >= 0.75 || absy >= 0.5) && scale == 0)
94 {
95 double d2m1 = __x2y2m1 (absx, absy);
96 __real__ result = __log1p (d2m1) / 2.0;
97 }
da865e95
JM
98 else
99 {
100 double d = __ieee754_hypot (absx, absy);
101 __real__ result = __ieee754_log (d) - scale * M_LN2;
102 }
1897ad44 103
c131718c
UD
104 __imag__ result = __ieee754_atan2 (__imag__ x, __real__ x);
105 }
106 else
107 {
108 __imag__ result = __nan ("");
63551311
UD
109 if (rcls == FP_INFINITE || icls == FP_INFINITE)
110 /* Real or imaginary part is infinite. */
c131718c
UD
111 __real__ result = HUGE_VAL;
112 else
113 __real__ result = __nan ("");
114 }
115
116 return result;
117}
118weak_alias (__clog, clog)
119#ifdef NO_LONG_DOUBLE
120strong_alias (__clog, __clogl)
121weak_alias (__clog, clogl)
122#endif