complex revision 1.3 1 // The template and inlines for the -*- C++ -*- complex number classes.
2
3 // Copyright (C) 1997-2013 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This 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
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 /** @file include/complex
26 * This is a Standard C++ Library header.
27 */
28
29 //
30 // ISO C++ 14882: 26.2 Complex Numbers
31 // Note: this is not a conforming implementation.
32 // Initially implemented by Ulrich Drepper <drepper (a] cygnus.com>
33 // Improved by Gabriel Dos Reis <dosreis (a] cmla.ens-cachan.fr>
34 //
35
36 #ifndef _GLIBCXX_COMPLEX
37 #define _GLIBCXX_COMPLEX 1
38
39 #pragma GCC system_header
40
41 #include <bits/c++config.h>
42 #include <bits/cpp_type_traits.h>
43 #include <ext/type_traits.h>
44 #include <cmath>
45 #include <sstream>
46
47 #if _GLIBCXX_USE_C99_COMPLEX
48 // This is disgusting; we can't include ccomplex because that requires c++11
49 // and we can't use the builtins because those point to the wrong
50 // ABI-wise cabs/cabsf so we manually declare those here and use
51 // them directly.
52 extern "C" float __c99_cabsf(_Complex float);
53 extern "C" double __c99_cabs(_Complex double);
54 extern "C" long double __c99_cabsl(_Complex long double);
55 #endif
56
57 // Get rid of a macro possibly defined in <complex.h>
58 #undef complex
59
60 namespace std _GLIBCXX_VISIBILITY(default)
61 {
62 _GLIBCXX_BEGIN_NAMESPACE_VERSION
63
64 /**
65 * @defgroup complex_numbers Complex Numbers
66 * @ingroup numerics
67 *
68 * Classes and functions for complex numbers.
69 * @{
70 */
71
72 // Forward declarations.
73 template<typename _Tp> class complex;
74 template<> class complex<float>;
75 template<> class complex<double>;
76 template<> class complex<long double>;
77
78 /// Return magnitude of @a z.
79 template<typename _Tp> _Tp abs(const complex<_Tp>&);
80 /// Return phase angle of @a z.
81 template<typename _Tp> _Tp arg(const complex<_Tp>&);
82 /// Return @a z magnitude squared.
83 template<typename _Tp> _Tp norm(const complex<_Tp>&);
84
85 /// Return complex conjugate of @a z.
86 template<typename _Tp> complex<_Tp> conj(const complex<_Tp>&);
87 /// Return complex with magnitude @a rho and angle @a theta.
88 template<typename _Tp> complex<_Tp> polar(const _Tp&, const _Tp& = 0);
89
90 // Transcendentals:
91 /// Return complex cosine of @a z.
92 template<typename _Tp> complex<_Tp> cos(const complex<_Tp>&);
93 /// Return complex hyperbolic cosine of @a z.
94 template<typename _Tp> complex<_Tp> cosh(const complex<_Tp>&);
95 /// Return complex base e exponential of @a z.
96 template<typename _Tp> complex<_Tp> exp(const complex<_Tp>&);
97 /// Return complex natural logarithm of @a z.
98 template<typename _Tp> complex<_Tp> log(const complex<_Tp>&);
99 /// Return complex base 10 logarithm of @a z.
100 template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&);
101 #if __cplusplus < 201103L
102 // DR 844.
103 /// Return @a x to the @a y'th power.
104 template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int);
105 #endif
106 /// Return @a x to the @a y'th power.
107 template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&);
108 /// Return @a x to the @a y'th power.
109 template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&,
110 const complex<_Tp>&);
111 /// Return @a x to the @a y'th power.
112 template<typename _Tp> complex<_Tp> pow(const _Tp&, const complex<_Tp>&);
113 /// Return complex sine of @a z.
114 template<typename _Tp> complex<_Tp> sin(const complex<_Tp>&);
115 /// Return complex hyperbolic sine of @a z.
116 template<typename _Tp> complex<_Tp> sinh(const complex<_Tp>&);
117 /// Return complex square root of @a z.
118 template<typename _Tp> complex<_Tp> sqrt(const complex<_Tp>&);
119 /// Return complex tangent of @a z.
120 template<typename _Tp> complex<_Tp> tan(const complex<_Tp>&);
121 /// Return complex hyperbolic tangent of @a z.
122 template<typename _Tp> complex<_Tp> tanh(const complex<_Tp>&);
123
124
125 // 26.2.2 Primary template class complex
126 /**
127 * Template to represent complex numbers.
128 *
129 * Specializations for float, double, and long double are part of the
130 * library. Results with any other type are not guaranteed.
131 *
132 * @param Tp Type of real and imaginary values.
133 */
134 template<typename _Tp>
135 struct complex
136 {
137 /// Value typedef.
138 typedef _Tp value_type;
139
140 /// Default constructor. First parameter is x, second parameter is y.
141 /// Unspecified parameters default to 0.
142 _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
143 : _M_real(__r), _M_imag(__i) { }
144
145 // Lets the compiler synthesize the copy constructor
146 // complex (const complex<_Tp>&);
147 /// Copy constructor.
148 template<typename _Up>
149 _GLIBCXX_CONSTEXPR complex(const complex<_Up>& __z)
150 : _M_real(__z.real()), _M_imag(__z.imag()) { }
151
152 #if __cplusplus >= 201103L
153 // _GLIBCXX_RESOLVE_LIB_DEFECTS
154 // DR 387. std::complex over-encapsulated.
155 _GLIBCXX_ABI_TAG_CXX11
156 constexpr _Tp
157 real() { return _M_real; }
158
159 _GLIBCXX_ABI_TAG_CXX11
160 constexpr _Tp
161 imag() { return _M_imag; }
162 #else
163 /// Return real part of complex number.
164 _Tp&
165 real() { return _M_real; }
166
167 /// Return real part of complex number.
168 const _Tp&
169 real() const { return _M_real; }
170
171 /// Return imaginary part of complex number.
172 _Tp&
173 imag() { return _M_imag; }
174
175 /// Return imaginary part of complex number.
176 const _Tp&
177 imag() const { return _M_imag; }
178 #endif
179
180 // _GLIBCXX_RESOLVE_LIB_DEFECTS
181 // DR 387. std::complex over-encapsulated.
182 void
183 real(_Tp __val) { _M_real = __val; }
184
185 void
186 imag(_Tp __val) { _M_imag = __val; }
187
188 /// Assign this complex number to scalar @a t.
189 complex<_Tp>& operator=(const _Tp&);
190
191 /// Add @a t to this complex number.
192 // 26.2.5/1
193 complex<_Tp>&
194 operator+=(const _Tp& __t)
195 {
196 _M_real += __t;
197 return *this;
198 }
199
200 /// Subtract @a t from this complex number.
201 // 26.2.5/3
202 complex<_Tp>&
203 operator-=(const _Tp& __t)
204 {
205 _M_real -= __t;
206 return *this;
207 }
208
209 /// Multiply this complex number by @a t.
210 complex<_Tp>& operator*=(const _Tp&);
211 /// Divide this complex number by @a t.
212 complex<_Tp>& operator/=(const _Tp&);
213
214 // Lets the compiler synthesize the
215 // copy and assignment operator
216 // complex<_Tp>& operator= (const complex<_Tp>&);
217 /// Assign this complex number to complex @a z.
218 template<typename _Up>
219 complex<_Tp>& operator=(const complex<_Up>&);
220 /// Add @a z to this complex number.
221 template<typename _Up>
222 complex<_Tp>& operator+=(const complex<_Up>&);
223 /// Subtract @a z from this complex number.
224 template<typename _Up>
225 complex<_Tp>& operator-=(const complex<_Up>&);
226 /// Multiply this complex number by @a z.
227 template<typename _Up>
228 complex<_Tp>& operator*=(const complex<_Up>&);
229 /// Divide this complex number by @a z.
230 template<typename _Up>
231 complex<_Tp>& operator/=(const complex<_Up>&);
232
233 _GLIBCXX_USE_CONSTEXPR complex __rep() const
234 { return *this; }
235
236 private:
237 _Tp _M_real;
238 _Tp _M_imag;
239 };
240
241 template<typename _Tp>
242 complex<_Tp>&
243 complex<_Tp>::operator=(const _Tp& __t)
244 {
245 _M_real = __t;
246 _M_imag = _Tp();
247 return *this;
248 }
249
250 // 26.2.5/5
251 template<typename _Tp>
252 complex<_Tp>&
253 complex<_Tp>::operator*=(const _Tp& __t)
254 {
255 _M_real *= __t;
256 _M_imag *= __t;
257 return *this;
258 }
259
260 // 26.2.5/7
261 template<typename _Tp>
262 complex<_Tp>&
263 complex<_Tp>::operator/=(const _Tp& __t)
264 {
265 _M_real /= __t;
266 _M_imag /= __t;
267 return *this;
268 }
269
270 template<typename _Tp>
271 template<typename _Up>
272 complex<_Tp>&
273 complex<_Tp>::operator=(const complex<_Up>& __z)
274 {
275 _M_real = __z.real();
276 _M_imag = __z.imag();
277 return *this;
278 }
279
280 // 26.2.5/9
281 template<typename _Tp>
282 template<typename _Up>
283 complex<_Tp>&
284 complex<_Tp>::operator+=(const complex<_Up>& __z)
285 {
286 _M_real += __z.real();
287 _M_imag += __z.imag();
288 return *this;
289 }
290
291 // 26.2.5/11
292 template<typename _Tp>
293 template<typename _Up>
294 complex<_Tp>&
295 complex<_Tp>::operator-=(const complex<_Up>& __z)
296 {
297 _M_real -= __z.real();
298 _M_imag -= __z.imag();
299 return *this;
300 }
301
302 // 26.2.5/13
303 // XXX: This is a grammar school implementation.
304 template<typename _Tp>
305 template<typename _Up>
306 complex<_Tp>&
307 complex<_Tp>::operator*=(const complex<_Up>& __z)
308 {
309 const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag();
310 _M_imag = _M_real * __z.imag() + _M_imag * __z.real();
311 _M_real = __r;
312 return *this;
313 }
314
315 // 26.2.5/15
316 // XXX: This is a grammar school implementation.
317 template<typename _Tp>
318 template<typename _Up>
319 complex<_Tp>&
320 complex<_Tp>::operator/=(const complex<_Up>& __z)
321 {
322 const _Tp __r = _M_real * __z.real() + _M_imag * __z.imag();
323 const _Tp __n = std::norm(__z);
324 _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n;
325 _M_real = __r / __n;
326 return *this;
327 }
328
329 // Operators:
330 //@{
331 /// Return new complex value @a x plus @a y.
332 template<typename _Tp>
333 inline complex<_Tp>
334 operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
335 {
336 complex<_Tp> __r = __x;
337 __r += __y;
338 return __r;
339 }
340
341 template<typename _Tp>
342 inline complex<_Tp>
343 operator+(const complex<_Tp>& __x, const _Tp& __y)
344 {
345 complex<_Tp> __r = __x;
346 __r += __y;
347 return __r;
348 }
349
350 template<typename _Tp>
351 inline complex<_Tp>
352 operator+(const _Tp& __x, const complex<_Tp>& __y)
353 {
354 complex<_Tp> __r = __y;
355 __r += __x;
356 return __r;
357 }
358 //@}
359
360 //@{
361 /// Return new complex value @a x minus @a y.
362 template<typename _Tp>
363 inline complex<_Tp>
364 operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
365 {
366 complex<_Tp> __r = __x;
367 __r -= __y;
368 return __r;
369 }
370
371 template<typename _Tp>
372 inline complex<_Tp>
373 operator-(const complex<_Tp>& __x, const _Tp& __y)
374 {
375 complex<_Tp> __r = __x;
376 __r -= __y;
377 return __r;
378 }
379
380 template<typename _Tp>
381 inline complex<_Tp>
382 operator-(const _Tp& __x, const complex<_Tp>& __y)
383 {
384 complex<_Tp> __r(__x, -__y.imag());
385 __r -= __y.real();
386 return __r;
387 }
388 //@}
389
390 //@{
391 /// Return new complex value @a x times @a y.
392 template<typename _Tp>
393 inline complex<_Tp>
394 operator*(const complex<_Tp>& __x, const complex<_Tp>& __y)
395 {
396 complex<_Tp> __r = __x;
397 __r *= __y;
398 return __r;
399 }
400
401 template<typename _Tp>
402 inline complex<_Tp>
403 operator*(const complex<_Tp>& __x, const _Tp& __y)
404 {
405 complex<_Tp> __r = __x;
406 __r *= __y;
407 return __r;
408 }
409
410 template<typename _Tp>
411 inline complex<_Tp>
412 operator*(const _Tp& __x, const complex<_Tp>& __y)
413 {
414 complex<_Tp> __r = __y;
415 __r *= __x;
416 return __r;
417 }
418 //@}
419
420 //@{
421 /// Return new complex value @a x divided by @a y.
422 template<typename _Tp>
423 inline complex<_Tp>
424 operator/(const complex<_Tp>& __x, const complex<_Tp>& __y)
425 {
426 complex<_Tp> __r = __x;
427 __r /= __y;
428 return __r;
429 }
430
431 template<typename _Tp>
432 inline complex<_Tp>
433 operator/(const complex<_Tp>& __x, const _Tp& __y)
434 {
435 complex<_Tp> __r = __x;
436 __r /= __y;
437 return __r;
438 }
439
440 template<typename _Tp>
441 inline complex<_Tp>
442 operator/(const _Tp& __x, const complex<_Tp>& __y)
443 {
444 complex<_Tp> __r = __x;
445 __r /= __y;
446 return __r;
447 }
448 //@}
449
450 /// Return @a x.
451 template<typename _Tp>
452 inline complex<_Tp>
453 operator+(const complex<_Tp>& __x)
454 { return __x; }
455
456 /// Return complex negation of @a x.
457 template<typename _Tp>
458 inline complex<_Tp>
459 operator-(const complex<_Tp>& __x)
460 { return complex<_Tp>(-__x.real(), -__x.imag()); }
461
462 //@{
463 /// Return true if @a x is equal to @a y.
464 template<typename _Tp>
465 inline _GLIBCXX_CONSTEXPR bool
466 operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
467 { return __x.real() == __y.real() && __x.imag() == __y.imag(); }
468
469 template<typename _Tp>
470 inline _GLIBCXX_CONSTEXPR bool
471 operator==(const complex<_Tp>& __x, const _Tp& __y)
472 { return __x.real() == __y && __x.imag() == _Tp(); }
473
474 template<typename _Tp>
475 inline _GLIBCXX_CONSTEXPR bool
476 operator==(const _Tp& __x, const complex<_Tp>& __y)
477 { return __x == __y.real() && _Tp() == __y.imag(); }
478 //@}
479
480 //@{
481 /// Return false if @a x is equal to @a y.
482 template<typename _Tp>
483 inline _GLIBCXX_CONSTEXPR bool
484 operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
485 { return __x.real() != __y.real() || __x.imag() != __y.imag(); }
486
487 template<typename _Tp>
488 inline _GLIBCXX_CONSTEXPR bool
489 operator!=(const complex<_Tp>& __x, const _Tp& __y)
490 { return __x.real() != __y || __x.imag() != _Tp(); }
491
492 template<typename _Tp>
493 inline _GLIBCXX_CONSTEXPR bool
494 operator!=(const _Tp& __x, const complex<_Tp>& __y)
495 { return __x != __y.real() || _Tp() != __y.imag(); }
496 //@}
497
498 /// Extraction operator for complex values.
499 template<typename _Tp, typename _CharT, class _Traits>
500 basic_istream<_CharT, _Traits>&
501 operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
502 {
503 _Tp __re_x, __im_x;
504 _CharT __ch;
505 __is >> __ch;
506 if (__ch == '(')
507 {
508 __is >> __re_x >> __ch;
509 if (__ch == ',')
510 {
511 __is >> __im_x >> __ch;
512 if (__ch == ')')
513 __x = complex<_Tp>(__re_x, __im_x);
514 else
515 __is.setstate(ios_base::failbit);
516 }
517 else if (__ch == ')')
518 __x = __re_x;
519 else
520 __is.setstate(ios_base::failbit);
521 }
522 else
523 {
524 __is.putback(__ch);
525 __is >> __re_x;
526 __x = __re_x;
527 }
528 return __is;
529 }
530
531 /// Insertion operator for complex values.
532 template<typename _Tp, typename _CharT, class _Traits>
533 basic_ostream<_CharT, _Traits>&
534 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
535 {
536 basic_ostringstream<_CharT, _Traits> __s;
537 __s.flags(__os.flags());
538 __s.imbue(__os.getloc());
539 __s.precision(__os.precision());
540 __s << '(' << __x.real() << ',' << __x.imag() << ')';
541 return __os << __s.str();
542 }
543
544 // Values
545 #if __cplusplus >= 201103L
546 template<typename _Tp>
547 constexpr _Tp
548 real(const complex<_Tp>& __z)
549 { return __z.real(); }
550
551 template<typename _Tp>
552 constexpr _Tp
553 imag(const complex<_Tp>& __z)
554 { return __z.imag(); }
555 #else
556 template<typename _Tp>
557 inline _Tp&
558 real(complex<_Tp>& __z)
559 { return __z.real(); }
560
561 template<typename _Tp>
562 inline const _Tp&
563 real(const complex<_Tp>& __z)
564 { return __z.real(); }
565
566 template<typename _Tp>
567 inline _Tp&
568 imag(complex<_Tp>& __z)
569 { return __z.imag(); }
570
571 template<typename _Tp>
572 inline const _Tp&
573 imag(const complex<_Tp>& __z)
574 { return __z.imag(); }
575 #endif
576
577 // 26.2.7/3 abs(__z): Returns the magnitude of __z.
578 template<typename _Tp>
579 inline _Tp
580 __complex_abs(const complex<_Tp>& __z)
581 {
582 _Tp __x = __z.real();
583 _Tp __y = __z.imag();
584 const _Tp __s = std::max(abs(__x), abs(__y));
585 if (__s == _Tp()) // well ...
586 return __s;
587 __x /= __s;
588 __y /= __s;
589 return __s * sqrt(__x * __x + __y * __y);
590 }
591
592 #if _GLIBCXX_USE_C99_COMPLEX
593 // XXX: We can't use __builtin_cabs* because they are broken
594 inline float
595 __complex_abs(__complex__ float __z) { return __c99_cabsf(__z); }
596
597 inline double
598 __complex_abs(__complex__ double __z) { return __c99_cabs(__z); }
599
600 inline long double
601 __complex_abs(const __complex__ long double& __z)
602 { return __c99_cabsl(__z); }
603
604 template<typename _Tp>
605 inline _Tp
606 abs(const complex<_Tp>& __z) { return __complex_abs(__z.__rep()); }
607 #else
608 template<typename _Tp>
609 inline _Tp
610 abs(const complex<_Tp>& __z) { return __complex_abs(__z); }
611 #endif
612
613
614 // 26.2.7/4: arg(__z): Returns the phase angle of __z.
615 template<typename _Tp>
616 inline _Tp
617 __complex_arg(const complex<_Tp>& __z)
618 { return atan2(__z.imag(), __z.real()); }
619
620 #if _GLIBCXX_USE_C99_COMPLEX
621 inline float
622 __complex_arg(__complex__ float __z) { return __builtin_cargf(__z); }
623
624 inline double
625 __complex_arg(__complex__ double __z) { return __builtin_carg(__z); }
626
627 inline long double
628 __complex_arg(const __complex__ long double& __z)
629 { return __builtin_cargl(__z); }
630
631 template<typename _Tp>
632 inline _Tp
633 arg(const complex<_Tp>& __z) { return __complex_arg(__z.__rep()); }
634 #else
635 template<typename _Tp>
636 inline _Tp
637 arg(const complex<_Tp>& __z) { return __complex_arg(__z); }
638 #endif
639
640 // 26.2.7/5: norm(__z) returns the squared magnitude of __z.
641 // As defined, norm() is -not- a norm is the common mathematical
642 // sens used in numerics. The helper class _Norm_helper<> tries to
643 // distinguish between builtin floating point and the rest, so as
644 // to deliver an answer as close as possible to the real value.
645 template<bool>
646 struct _Norm_helper
647 {
648 template<typename _Tp>
649 static inline _Tp _S_do_it(const complex<_Tp>& __z)
650 {
651 const _Tp __x = __z.real();
652 const _Tp __y = __z.imag();
653 return __x * __x + __y * __y;
654 }
655 };
656
657 template<>
658 struct _Norm_helper<true>
659 {
660 template<typename _Tp>
661 static inline _Tp _S_do_it(const complex<_Tp>& __z)
662 {
663 _Tp __res = std::abs(__z);
664 return __res * __res;
665 }
666 };
667
668 template<typename _Tp>
669 inline _Tp
670 norm(const complex<_Tp>& __z)
671 {
672 return _Norm_helper<__is_floating<_Tp>::__value
673 && !_GLIBCXX_FAST_MATH>::_S_do_it(__z);
674 }
675
676 template<typename _Tp>
677 inline complex<_Tp>
678 polar(const _Tp& __rho, const _Tp& __theta)
679 { return complex<_Tp>(__rho * cos(__theta), __rho * sin(__theta)); }
680
681 template<typename _Tp>
682 inline complex<_Tp>
683 conj(const complex<_Tp>& __z)
684 { return complex<_Tp>(__z.real(), -__z.imag()); }
685
686 // Transcendentals
687
688 // 26.2.8/1 cos(__z): Returns the cosine of __z.
689 template<typename _Tp>
690 inline complex<_Tp>
691 __complex_cos(const complex<_Tp>& __z)
692 {
693 const _Tp __x = __z.real();
694 const _Tp __y = __z.imag();
695 return complex<_Tp>(cos(__x) * cosh(__y), -sin(__x) * sinh(__y));
696 }
697
698 #if _GLIBCXX_USE_C99_COMPLEX
699 inline __complex__ float
700 __complex_cos(__complex__ float __z) { return __builtin_ccosf(__z); }
701
702 inline __complex__ double
703 __complex_cos(__complex__ double __z) { return __builtin_ccos(__z); }
704
705 inline __complex__ long double
706 __complex_cos(const __complex__ long double& __z)
707 { return __builtin_ccosl(__z); }
708
709 template<typename _Tp>
710 inline complex<_Tp>
711 cos(const complex<_Tp>& __z) { return __complex_cos(__z.__rep()); }
712 #else
713 template<typename _Tp>
714 inline complex<_Tp>
715 cos(const complex<_Tp>& __z) { return __complex_cos(__z); }
716 #endif
717
718 // 26.2.8/2 cosh(__z): Returns the hyperbolic cosine of __z.
719 template<typename _Tp>
720 inline complex<_Tp>
721 __complex_cosh(const complex<_Tp>& __z)
722 {
723 const _Tp __x = __z.real();
724 const _Tp __y = __z.imag();
725 return complex<_Tp>(cosh(__x) * cos(__y), sinh(__x) * sin(__y));
726 }
727
728 #if _GLIBCXX_USE_C99_COMPLEX
729 inline __complex__ float
730 __complex_cosh(__complex__ float __z) { return __builtin_ccoshf(__z); }
731
732 inline __complex__ double
733 __complex_cosh(__complex__ double __z) { return __builtin_ccosh(__z); }
734
735 inline __complex__ long double
736 __complex_cosh(const __complex__ long double& __z)
737 { return __builtin_ccoshl(__z); }
738
739 template<typename _Tp>
740 inline complex<_Tp>
741 cosh(const complex<_Tp>& __z) { return __complex_cosh(__z.__rep()); }
742 #else
743 template<typename _Tp>
744 inline complex<_Tp>
745 cosh(const complex<_Tp>& __z) { return __complex_cosh(__z); }
746 #endif
747
748 // 26.2.8/3 exp(__z): Returns the complex base e exponential of x
749 template<typename _Tp>
750 inline complex<_Tp>
751 __complex_exp(const complex<_Tp>& __z)
752 { return std::polar(exp(__z.real()), __z.imag()); }
753
754 #if _GLIBCXX_USE_C99_COMPLEX
755 inline __complex__ float
756 __complex_exp(__complex__ float __z) { return __builtin_cexpf(__z); }
757
758 inline __complex__ double
759 __complex_exp(__complex__ double __z) { return __builtin_cexp(__z); }
760
761 inline __complex__ long double
762 __complex_exp(const __complex__ long double& __z)
763 { return __builtin_cexpl(__z); }
764
765 template<typename _Tp>
766 inline complex<_Tp>
767 exp(const complex<_Tp>& __z) { return __complex_exp(__z.__rep()); }
768 #else
769 template<typename _Tp>
770 inline complex<_Tp>
771 exp(const complex<_Tp>& __z) { return __complex_exp(__z); }
772 #endif
773
774 // 26.2.8/5 log(__z): Returns the natural complex logarithm of __z.
775 // The branch cut is along the negative axis.
776 template<typename _Tp>
777 inline complex<_Tp>
778 __complex_log(const complex<_Tp>& __z)
779 { return complex<_Tp>(log(std::abs(__z)), std::arg(__z)); }
780
781 #if _GLIBCXX_USE_C99_COMPLEX
782 inline __complex__ float
783 __complex_log(__complex__ float __z) { return __builtin_clogf(__z); }
784
785 inline __complex__ double
786 __complex_log(__complex__ double __z) { return __builtin_clog(__z); }
787
788 inline __complex__ long double
789 __complex_log(const __complex__ long double& __z)
790 { return __builtin_clogl(__z); }
791
792 template<typename _Tp>
793 inline complex<_Tp>
794 log(const complex<_Tp>& __z) { return __complex_log(__z.__rep()); }
795 #else
796 template<typename _Tp>
797 inline complex<_Tp>
798 log(const complex<_Tp>& __z) { return __complex_log(__z); }
799 #endif
800
801 template<typename _Tp>
802 inline complex<_Tp>
803 log10(const complex<_Tp>& __z)
804 { return std::log(__z) / log(_Tp(10.0)); }
805
806 // 26.2.8/10 sin(__z): Returns the sine of __z.
807 template<typename _Tp>
808 inline complex<_Tp>
809 __complex_sin(const complex<_Tp>& __z)
810 {
811 const _Tp __x = __z.real();
812 const _Tp __y = __z.imag();
813 return complex<_Tp>(sin(__x) * cosh(__y), cos(__x) * sinh(__y));
814 }
815
816 #if _GLIBCXX_USE_C99_COMPLEX
817 inline __complex__ float
818 __complex_sin(__complex__ float __z) { return __builtin_csinf(__z); }
819
820 inline __complex__ double
821 __complex_sin(__complex__ double __z) { return __builtin_csin(__z); }
822
823 inline __complex__ long double
824 __complex_sin(const __complex__ long double& __z)
825 { return __builtin_csinl(__z); }
826
827 template<typename _Tp>
828 inline complex<_Tp>
829 sin(const complex<_Tp>& __z) { return __complex_sin(__z.__rep()); }
830 #else
831 template<typename _Tp>
832 inline complex<_Tp>
833 sin(const complex<_Tp>& __z) { return __complex_sin(__z); }
834 #endif
835
836 // 26.2.8/11 sinh(__z): Returns the hyperbolic sine of __z.
837 template<typename _Tp>
838 inline complex<_Tp>
839 __complex_sinh(const complex<_Tp>& __z)
840 {
841 const _Tp __x = __z.real();
842 const _Tp __y = __z.imag();
843 return complex<_Tp>(sinh(__x) * cos(__y), cosh(__x) * sin(__y));
844 }
845
846 #if _GLIBCXX_USE_C99_COMPLEX
847 inline __complex__ float
848 __complex_sinh(__complex__ float __z) { return __builtin_csinhf(__z); }
849
850 inline __complex__ double
851 __complex_sinh(__complex__ double __z) { return __builtin_csinh(__z); }
852
853 inline __complex__ long double
854 __complex_sinh(const __complex__ long double& __z)
855 { return __builtin_csinhl(__z); }
856
857 template<typename _Tp>
858 inline complex<_Tp>
859 sinh(const complex<_Tp>& __z) { return __complex_sinh(__z.__rep()); }
860 #else
861 template<typename _Tp>
862 inline complex<_Tp>
863 sinh(const complex<_Tp>& __z) { return __complex_sinh(__z); }
864 #endif
865
866 // 26.2.8/13 sqrt(__z): Returns the complex square root of __z.
867 // The branch cut is on the negative axis.
868 template<typename _Tp>
869 complex<_Tp>
870 __complex_sqrt(const complex<_Tp>& __z)
871 {
872 _Tp __x = __z.real();
873 _Tp __y = __z.imag();
874
875 if (__x == _Tp())
876 {
877 _Tp __t = sqrt(abs(__y) / 2);
878 return complex<_Tp>(__t, __y < _Tp() ? -__t : __t);
879 }
880 else
881 {
882 _Tp __t = sqrt(2 * (std::abs(__z) + abs(__x)));
883 _Tp __u = __t / 2;
884 return __x > _Tp()
885 ? complex<_Tp>(__u, __y / __t)
886 : complex<_Tp>(abs(__y) / __t, __y < _Tp() ? -__u : __u);
887 }
888 }
889
890 #if _GLIBCXX_USE_C99_COMPLEX
891 inline __complex__ float
892 __complex_sqrt(__complex__ float __z) { return __builtin_csqrtf(__z); }
893
894 inline __complex__ double
895 __complex_sqrt(__complex__ double __z) { return __builtin_csqrt(__z); }
896
897 inline __complex__ long double
898 __complex_sqrt(const __complex__ long double& __z)
899 { return __builtin_csqrtl(__z); }
900
901 template<typename _Tp>
902 inline complex<_Tp>
903 sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z.__rep()); }
904 #else
905 template<typename _Tp>
906 inline complex<_Tp>
907 sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z); }
908 #endif
909
910 // 26.2.8/14 tan(__z): Return the complex tangent of __z.
911
912 template<typename _Tp>
913 inline complex<_Tp>
914 __complex_tan(const complex<_Tp>& __z)
915 { return std::sin(__z) / std::cos(__z); }
916
917 #if _GLIBCXX_USE_C99_COMPLEX
918 inline __complex__ float
919 __complex_tan(__complex__ float __z) { return __builtin_ctanf(__z); }
920
921 inline __complex__ double
922 __complex_tan(__complex__ double __z) { return __builtin_ctan(__z); }
923
924 inline __complex__ long double
925 __complex_tan(const __complex__ long double& __z)
926 { return __builtin_ctanl(__z); }
927
928 template<typename _Tp>
929 inline complex<_Tp>
930 tan(const complex<_Tp>& __z) { return __complex_tan(__z.__rep()); }
931 #else
932 template<typename _Tp>
933 inline complex<_Tp>
934 tan(const complex<_Tp>& __z) { return __complex_tan(__z); }
935 #endif
936
937
938 // 26.2.8/15 tanh(__z): Returns the hyperbolic tangent of __z.
939
940 template<typename _Tp>
941 inline complex<_Tp>
942 __complex_tanh(const complex<_Tp>& __z)
943 { return std::sinh(__z) / std::cosh(__z); }
944
945 #if _GLIBCXX_USE_C99_COMPLEX
946 inline __complex__ float
947 __complex_tanh(__complex__ float __z) { return __builtin_ctanhf(__z); }
948
949 inline __complex__ double
950 __complex_tanh(__complex__ double __z) { return __builtin_ctanh(__z); }
951
952 inline __complex__ long double
953 __complex_tanh(const __complex__ long double& __z)
954 { return __builtin_ctanhl(__z); }
955
956 template<typename _Tp>
957 inline complex<_Tp>
958 tanh(const complex<_Tp>& __z) { return __complex_tanh(__z.__rep()); }
959 #else
960 template<typename _Tp>
961 inline complex<_Tp>
962 tanh(const complex<_Tp>& __z) { return __complex_tanh(__z); }
963 #endif
964
965
966 // 26.2.8/9 pow(__x, __y): Returns the complex power base of __x
967 // raised to the __y-th power. The branch
968 // cut is on the negative axis.
969 #if __cplusplus < 201103L
970 template<typename _Tp>
971 complex<_Tp>
972 __complex_pow_unsigned(complex<_Tp> __x, unsigned __n)
973 {
974 complex<_Tp> __y = __n % 2 ? __x : complex<_Tp>(1);
975
976 while (__n >>= 1)
977 {
978 __x *= __x;
979 if (__n % 2)
980 __y *= __x;
981 }
982
983 return __y;
984 }
985
986 // _GLIBCXX_RESOLVE_LIB_DEFECTS
987 // DR 844. complex pow return type is ambiguous.
988 template<typename _Tp>
989 inline complex<_Tp>
990 pow(const complex<_Tp>& __z, int __n)
991 {
992 return __n < 0
993 ? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n)
994 : std::__complex_pow_unsigned(__z, __n);
995 }
996 #endif
997
998 template<typename _Tp>
999 complex<_Tp>
1000 pow(const complex<_Tp>& __x, const _Tp& __y)
1001 {
1002 #ifndef _GLIBCXX_USE_C99_COMPLEX
1003 if (__x == _Tp())
1004 return _Tp();
1005 #endif
1006 if (__x.imag() == _Tp() && __x.real() > _Tp())
1007 return pow(__x.real(), __y);
1008
1009 complex<_Tp> __t = std::log(__x);
1010 return std::polar(exp(__y * __t.real()), __y * __t.imag());
1011 }
1012
1013 template<typename _Tp>
1014 inline complex<_Tp>
1015 __complex_pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
1016 { return __x == _Tp() ? _Tp() : std::exp(__y * std::log(__x)); }
1017
1018 #if _GLIBCXX_USE_C99_COMPLEX
1019 inline __complex__ float
1020 __complex_pow(__complex__ float __x, __complex__ float __y)
1021 { return __builtin_cpowf(__x, __y); }
1022
1023 inline __complex__ double
1024 __complex_pow(__complex__ double __x, __complex__ double __y)
1025 { return __builtin_cpow(__x, __y); }
1026
1027 inline __complex__ long double
1028 __complex_pow(const __complex__ long double& __x,
1029 const __complex__ long double& __y)
1030 { return __builtin_cpowl(__x, __y); }
1031
1032 template<typename _Tp>
1033 inline complex<_Tp>
1034 pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
1035 { return __complex_pow(__x.__rep(), __y.__rep()); }
1036 #else
1037 template<typename _Tp>
1038 inline complex<_Tp>
1039 pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
1040 { return __complex_pow(__x, __y); }
1041 #endif
1042
1043 template<typename _Tp>
1044 inline complex<_Tp>
1045 pow(const _Tp& __x, const complex<_Tp>& __y)
1046 {
1047 return __x > _Tp() ? std::polar(pow(__x, __y.real()),
1048 __y.imag() * log(__x))
1049 : std::pow(complex<_Tp>(__x), __y);
1050 }
1051
1052 /// 26.2.3 complex specializations
1053 /// complex<float> specialization
1054 template<>
1055 struct complex<float>
1056 {
1057 typedef float value_type;
1058 typedef __complex__ float _ComplexT;
1059
1060 _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
1061
1062 _GLIBCXX_CONSTEXPR complex(float __r = 0.0f, float __i = 0.0f)
1063 #if __cplusplus >= 201103L
1064 : _M_value{ __r, __i } { }
1065 #else
1066 {
1067 __real__ _M_value = __r;
1068 __imag__ _M_value = __i;
1069 }
1070 #endif
1071
1072 explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&);
1073 explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
1074
1075 #if __cplusplus >= 201103L
1076 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1077 // DR 387. std::complex over-encapsulated.
1078 __attribute ((__abi_tag__ ("cxx11")))
1079 constexpr float
1080 real() { return __real__ _M_value; }
1081
1082 __attribute ((__abi_tag__ ("cxx11")))
1083 constexpr float
1084 imag() { return __imag__ _M_value; }
1085 #else
1086 float&
1087 real() { return __real__ _M_value; }
1088
1089 const float&
1090 real() const { return __real__ _M_value; }
1091
1092 float&
1093 imag() { return __imag__ _M_value; }
1094
1095 const float&
1096 imag() const { return __imag__ _M_value; }
1097 #endif
1098
1099 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1100 // DR 387. std::complex over-encapsulated.
1101 void
1102 real(float __val) { __real__ _M_value = __val; }
1103
1104 void
1105 imag(float __val) { __imag__ _M_value = __val; }
1106
1107 complex&
1108 operator=(float __f)
1109 {
1110 _M_value = __f;
1111 return *this;
1112 }
1113
1114 complex&
1115 operator+=(float __f)
1116 {
1117 _M_value += __f;
1118 return *this;
1119 }
1120
1121 complex&
1122 operator-=(float __f)
1123 {
1124 _M_value -= __f;
1125 return *this;
1126 }
1127
1128 complex&
1129 operator*=(float __f)
1130 {
1131 _M_value *= __f;
1132 return *this;
1133 }
1134
1135 complex&
1136 operator/=(float __f)
1137 {
1138 _M_value /= __f;
1139 return *this;
1140 }
1141
1142 // Let the compiler synthesize the copy and assignment
1143 // operator. It always does a pretty good job.
1144 // complex& operator=(const complex&);
1145
1146 template<typename _Tp>
1147 complex&
1148 operator=(const complex<_Tp>& __z)
1149 {
1150 __real__ _M_value = __z.real();
1151 __imag__ _M_value = __z.imag();
1152 return *this;
1153 }
1154
1155 template<typename _Tp>
1156 complex&
1157 operator+=(const complex<_Tp>& __z)
1158 {
1159 __real__ _M_value += __z.real();
1160 __imag__ _M_value += __z.imag();
1161 return *this;
1162 }
1163
1164 template<class _Tp>
1165 complex&
1166 operator-=(const complex<_Tp>& __z)
1167 {
1168 __real__ _M_value -= __z.real();
1169 __imag__ _M_value -= __z.imag();
1170 return *this;
1171 }
1172
1173 template<class _Tp>
1174 complex&
1175 operator*=(const complex<_Tp>& __z)
1176 {
1177 _ComplexT __t;
1178 __real__ __t = __z.real();
1179 __imag__ __t = __z.imag();
1180 _M_value *= __t;
1181 return *this;
1182 }
1183
1184 template<class _Tp>
1185 complex&
1186 operator/=(const complex<_Tp>& __z)
1187 {
1188 _ComplexT __t;
1189 __real__ __t = __z.real();
1190 __imag__ __t = __z.imag();
1191 _M_value /= __t;
1192 return *this;
1193 }
1194
1195 _GLIBCXX_USE_CONSTEXPR _ComplexT __rep() const { return _M_value; }
1196
1197 private:
1198 _ComplexT _M_value;
1199 };
1200
1201 /// 26.2.3 complex specializations
1202 /// complex<double> specialization
1203 template<>
1204 struct complex<double>
1205 {
1206 typedef double value_type;
1207 typedef __complex__ double _ComplexT;
1208
1209 _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
1210
1211 _GLIBCXX_CONSTEXPR complex(double __r = 0.0, double __i = 0.0)
1212 #if __cplusplus >= 201103L
1213 : _M_value{ __r, __i } { }
1214 #else
1215 {
1216 __real__ _M_value = __r;
1217 __imag__ _M_value = __i;
1218 }
1219 #endif
1220
1221 _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
1222 : _M_value(__z.__rep()) { }
1223
1224 explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
1225
1226 #if __cplusplus >= 201103L
1227 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1228 // DR 387. std::complex over-encapsulated.
1229 __attribute ((__abi_tag__ ("cxx11")))
1230 constexpr double
1231 real() { return __real__ _M_value; }
1232
1233 __attribute ((__abi_tag__ ("cxx11")))
1234 constexpr double
1235 imag() { return __imag__ _M_value; }
1236 #else
1237 double&
1238 real() { return __real__ _M_value; }
1239
1240 const double&
1241 real() const { return __real__ _M_value; }
1242
1243 double&
1244 imag() { return __imag__ _M_value; }
1245
1246 const double&
1247 imag() const { return __imag__ _M_value; }
1248 #endif
1249
1250 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1251 // DR 387. std::complex over-encapsulated.
1252 void
1253 real(double __val) { __real__ _M_value = __val; }
1254
1255 void
1256 imag(double __val) { __imag__ _M_value = __val; }
1257
1258 complex&
1259 operator=(double __d)
1260 {
1261 _M_value = __d;
1262 return *this;
1263 }
1264
1265 complex&
1266 operator+=(double __d)
1267 {
1268 _M_value += __d;
1269 return *this;
1270 }
1271
1272 complex&
1273 operator-=(double __d)
1274 {
1275 _M_value -= __d;
1276 return *this;
1277 }
1278
1279 complex&
1280 operator*=(double __d)
1281 {
1282 _M_value *= __d;
1283 return *this;
1284 }
1285
1286 complex&
1287 operator/=(double __d)
1288 {
1289 _M_value /= __d;
1290 return *this;
1291 }
1292
1293 // The compiler will synthesize this, efficiently.
1294 // complex& operator=(const complex&);
1295
1296 template<typename _Tp>
1297 complex&
1298 operator=(const complex<_Tp>& __z)
1299 {
1300 __real__ _M_value = __z.real();
1301 __imag__ _M_value = __z.imag();
1302 return *this;
1303 }
1304
1305 template<typename _Tp>
1306 complex&
1307 operator+=(const complex<_Tp>& __z)
1308 {
1309 __real__ _M_value += __z.real();
1310 __imag__ _M_value += __z.imag();
1311 return *this;
1312 }
1313
1314 template<typename _Tp>
1315 complex&
1316 operator-=(const complex<_Tp>& __z)
1317 {
1318 __real__ _M_value -= __z.real();
1319 __imag__ _M_value -= __z.imag();
1320 return *this;
1321 }
1322
1323 template<typename _Tp>
1324 complex&
1325 operator*=(const complex<_Tp>& __z)
1326 {
1327 _ComplexT __t;
1328 __real__ __t = __z.real();
1329 __imag__ __t = __z.imag();
1330 _M_value *= __t;
1331 return *this;
1332 }
1333
1334 template<typename _Tp>
1335 complex&
1336 operator/=(const complex<_Tp>& __z)
1337 {
1338 _ComplexT __t;
1339 __real__ __t = __z.real();
1340 __imag__ __t = __z.imag();
1341 _M_value /= __t;
1342 return *this;
1343 }
1344
1345 _GLIBCXX_USE_CONSTEXPR _ComplexT __rep() const { return _M_value; }
1346
1347 private:
1348 _ComplexT _M_value;
1349 };
1350
1351 /// 26.2.3 complex specializations
1352 /// complex<long double> specialization
1353 template<>
1354 struct complex<long double>
1355 {
1356 typedef long double value_type;
1357 typedef __complex__ long double _ComplexT;
1358
1359 _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
1360
1361 _GLIBCXX_CONSTEXPR complex(long double __r = 0.0L,
1362 long double __i = 0.0L)
1363 #if __cplusplus >= 201103L
1364 : _M_value{ __r, __i } { }
1365 #else
1366 {
1367 __real__ _M_value = __r;
1368 __imag__ _M_value = __i;
1369 }
1370 #endif
1371
1372 _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
1373 : _M_value(__z.__rep()) { }
1374
1375 _GLIBCXX_CONSTEXPR complex(const complex<double>& __z)
1376 : _M_value(__z.__rep()) { }
1377
1378 #if __cplusplus >= 201103L
1379 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1380 // DR 387. std::complex over-encapsulated.
1381 __attribute ((__abi_tag__ ("cxx11")))
1382 constexpr long double
1383 real() { return __real__ _M_value; }
1384
1385 __attribute ((__abi_tag__ ("cxx11")))
1386 constexpr long double
1387 imag() { return __imag__ _M_value; }
1388 #else
1389 long double&
1390 real() { return __real__ _M_value; }
1391
1392 const long double&
1393 real() const { return __real__ _M_value; }
1394
1395 long double&
1396 imag() { return __imag__ _M_value; }
1397
1398 const long double&
1399 imag() const { return __imag__ _M_value; }
1400 #endif
1401
1402 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1403 // DR 387. std::complex over-encapsulated.
1404 void
1405 real(long double __val) { __real__ _M_value = __val; }
1406
1407 void
1408 imag(long double __val) { __imag__ _M_value = __val; }
1409
1410 complex&
1411 operator=(long double __r)
1412 {
1413 _M_value = __r;
1414 return *this;
1415 }
1416
1417 complex&
1418 operator+=(long double __r)
1419 {
1420 _M_value += __r;
1421 return *this;
1422 }
1423
1424 complex&
1425 operator-=(long double __r)
1426 {
1427 _M_value -= __r;
1428 return *this;
1429 }
1430
1431 complex&
1432 operator*=(long double __r)
1433 {
1434 _M_value *= __r;
1435 return *this;
1436 }
1437
1438 complex&
1439 operator/=(long double __r)
1440 {
1441 _M_value /= __r;
1442 return *this;
1443 }
1444
1445 // The compiler knows how to do this efficiently
1446 // complex& operator=(const complex&);
1447
1448 template<typename _Tp>
1449 complex&
1450 operator=(const complex<_Tp>& __z)
1451 {
1452 __real__ _M_value = __z.real();
1453 __imag__ _M_value = __z.imag();
1454 return *this;
1455 }
1456
1457 template<typename _Tp>
1458 complex&
1459 operator+=(const complex<_Tp>& __z)
1460 {
1461 __real__ _M_value += __z.real();
1462 __imag__ _M_value += __z.imag();
1463 return *this;
1464 }
1465
1466 template<typename _Tp>
1467 complex&
1468 operator-=(const complex<_Tp>& __z)
1469 {
1470 __real__ _M_value -= __z.real();
1471 __imag__ _M_value -= __z.imag();
1472 return *this;
1473 }
1474
1475 template<typename _Tp>
1476 complex&
1477 operator*=(const complex<_Tp>& __z)
1478 {
1479 _ComplexT __t;
1480 __real__ __t = __z.real();
1481 __imag__ __t = __z.imag();
1482 _M_value *= __t;
1483 return *this;
1484 }
1485
1486 template<typename _Tp>
1487 complex&
1488 operator/=(const complex<_Tp>& __z)
1489 {
1490 _ComplexT __t;
1491 __real__ __t = __z.real();
1492 __imag__ __t = __z.imag();
1493 _M_value /= __t;
1494 return *this;
1495 }
1496
1497 _GLIBCXX_USE_CONSTEXPR _ComplexT __rep() const { return _M_value; }
1498
1499 private:
1500 _ComplexT _M_value;
1501 };
1502
1503 // These bits have to be at the end of this file, so that the
1504 // specializations have all been defined.
1505 inline _GLIBCXX_CONSTEXPR
1506 complex<float>::complex(const complex<double>& __z)
1507 : _M_value(__z.__rep()) { }
1508
1509 inline _GLIBCXX_CONSTEXPR
1510 complex<float>::complex(const complex<long double>& __z)
1511 : _M_value(__z.__rep()) { }
1512
1513 inline _GLIBCXX_CONSTEXPR
1514 complex<double>::complex(const complex<long double>& __z)
1515 : _M_value(__z.__rep()) { }
1516
1517 // Inhibit implicit instantiations for required instantiations,
1518 // which are defined via explicit instantiations elsewhere.
1519 // NB: This syntax is a GNU extension.
1520 #if _GLIBCXX_EXTERN_TEMPLATE
1521 extern template istream& operator>>(istream&, complex<float>&);
1522 extern template ostream& operator<<(ostream&, const complex<float>&);
1523 extern template istream& operator>>(istream&, complex<double>&);
1524 extern template ostream& operator<<(ostream&, const complex<double>&);
1525 extern template istream& operator>>(istream&, complex<long double>&);
1526 extern template ostream& operator<<(ostream&, const complex<long double>&);
1527
1528 #ifdef _GLIBCXX_USE_WCHAR_T
1529 extern template wistream& operator>>(wistream&, complex<float>&);
1530 extern template wostream& operator<<(wostream&, const complex<float>&);
1531 extern template wistream& operator>>(wistream&, complex<double>&);
1532 extern template wostream& operator<<(wostream&, const complex<double>&);
1533 extern template wistream& operator>>(wistream&, complex<long double>&);
1534 extern template wostream& operator<<(wostream&, const complex<long double>&);
1535 #endif
1536 #endif
1537
1538 // @} group complex_numbers
1539
1540 _GLIBCXX_END_NAMESPACE_VERSION
1541 } // namespace
1542
1543 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
1544 {
1545 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1546
1547 // See ext/type_traits.h for the primary template.
1548 template<typename _Tp, typename _Up>
1549 struct __promote_2<std::complex<_Tp>, _Up>
1550 {
1551 public:
1552 typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
1553 };
1554
1555 template<typename _Tp, typename _Up>
1556 struct __promote_2<_Tp, std::complex<_Up> >
1557 {
1558 public:
1559 typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
1560 };
1561
1562 template<typename _Tp, typename _Up>
1563 struct __promote_2<std::complex<_Tp>, std::complex<_Up> >
1564 {
1565 public:
1566 typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
1567 };
1568
1569 _GLIBCXX_END_NAMESPACE_VERSION
1570 } // namespace
1571
1572 #if __cplusplus >= 201103L
1573
1574 namespace std _GLIBCXX_VISIBILITY(default)
1575 {
1576 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1577
1578 // Forward declarations.
1579 template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&);
1580 template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&);
1581 template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&);
1582
1583 template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&);
1584 template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&);
1585 template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&);
1586 // DR 595.
1587 template<typename _Tp> _Tp fabs(const std::complex<_Tp>&);
1588
1589 template<typename _Tp>
1590 inline std::complex<_Tp>
1591 __complex_acos(const std::complex<_Tp>& __z)
1592 {
1593 const std::complex<_Tp> __t = std::asin(__z);
1594 const _Tp __pi_2 = 1.5707963267948966192313216916397514L;
1595 return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
1596 }
1597
1598 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1599 inline __complex__ float
1600 __complex_acos(__complex__ float __z)
1601 { return __builtin_cacosf(__z); }
1602
1603 inline __complex__ double
1604 __complex_acos(__complex__ double __z)
1605 { return __builtin_cacos(__z); }
1606
1607 inline __complex__ long double
1608 __complex_acos(const __complex__ long double& __z)
1609 { return __builtin_cacosl(__z); }
1610
1611 template<typename _Tp>
1612 inline std::complex<_Tp>
1613 acos(const std::complex<_Tp>& __z)
1614 { return __complex_acos(__z.__rep()); }
1615 #else
1616 /// acos(__z) [8.1.2].
1617 // Effects: Behaves the same as C99 function cacos, defined
1618 // in subclause 7.3.5.1.
1619 template<typename _Tp>
1620 inline std::complex<_Tp>
1621 acos(const std::complex<_Tp>& __z)
1622 { return __complex_acos(__z); }
1623 #endif
1624
1625 template<typename _Tp>
1626 inline std::complex<_Tp>
1627 __complex_asin(const std::complex<_Tp>& __z)
1628 {
1629 std::complex<_Tp> __t(-__z.imag(), __z.real());
1630 __t = std::asinh(__t);
1631 return std::complex<_Tp>(__t.imag(), -__t.real());
1632 }
1633
1634 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1635 inline __complex__ float
1636 __complex_asin(__complex__ float __z)
1637 { return __builtin_casinf(__z); }
1638
1639 inline __complex__ double
1640 __complex_asin(__complex__ double __z)
1641 { return __builtin_casin(__z); }
1642
1643 inline __complex__ long double
1644 __complex_asin(const __complex__ long double& __z)
1645 { return __builtin_casinl(__z); }
1646
1647 template<typename _Tp>
1648 inline std::complex<_Tp>
1649 asin(const std::complex<_Tp>& __z)
1650 { return __complex_asin(__z.__rep()); }
1651 #else
1652 /// asin(__z) [8.1.3].
1653 // Effects: Behaves the same as C99 function casin, defined
1654 // in subclause 7.3.5.2.
1655 template<typename _Tp>
1656 inline std::complex<_Tp>
1657 asin(const std::complex<_Tp>& __z)
1658 { return __complex_asin(__z); }
1659 #endif
1660
1661 template<typename _Tp>
1662 std::complex<_Tp>
1663 __complex_atan(const std::complex<_Tp>& __z)
1664 {
1665 const _Tp __r2 = __z.real() * __z.real();
1666 const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
1667
1668 _Tp __num = __z.imag() + _Tp(1.0);
1669 _Tp __den = __z.imag() - _Tp(1.0);
1670
1671 __num = __r2 + __num * __num;
1672 __den = __r2 + __den * __den;
1673
1674 return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x),
1675 _Tp(0.25) * log(__num / __den));
1676 }
1677
1678 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1679 inline __complex__ float
1680 __complex_atan(__complex__ float __z)
1681 { return __builtin_catanf(__z); }
1682
1683 inline __complex__ double
1684 __complex_atan(__complex__ double __z)
1685 { return __builtin_catan(__z); }
1686
1687 inline __complex__ long double
1688 __complex_atan(const __complex__ long double& __z)
1689 { return __builtin_catanl(__z); }
1690
1691 template<typename _Tp>
1692 inline std::complex<_Tp>
1693 atan(const std::complex<_Tp>& __z)
1694 { return __complex_atan(__z.__rep()); }
1695 #else
1696 /// atan(__z) [8.1.4].
1697 // Effects: Behaves the same as C99 function catan, defined
1698 // in subclause 7.3.5.3.
1699 template<typename _Tp>
1700 inline std::complex<_Tp>
1701 atan(const std::complex<_Tp>& __z)
1702 { return __complex_atan(__z); }
1703 #endif
1704
1705 template<typename _Tp>
1706 std::complex<_Tp>
1707 __complex_acosh(const std::complex<_Tp>& __z)
1708 {
1709 // Kahan's formula.
1710 return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0)))
1711 + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
1712 }
1713
1714 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1715 inline __complex__ float
1716 __complex_acosh(__complex__ float __z)
1717 { return __builtin_cacoshf(__z); }
1718
1719 inline __complex__ double
1720 __complex_acosh(__complex__ double __z)
1721 { return __builtin_cacosh(__z); }
1722
1723 inline __complex__ long double
1724 __complex_acosh(const __complex__ long double& __z)
1725 { return __builtin_cacoshl(__z); }
1726
1727 template<typename _Tp>
1728 inline std::complex<_Tp>
1729 acosh(const std::complex<_Tp>& __z)
1730 { return __complex_acosh(__z.__rep()); }
1731 #else
1732 /// acosh(__z) [8.1.5].
1733 // Effects: Behaves the same as C99 function cacosh, defined
1734 // in subclause 7.3.6.1.
1735 template<typename _Tp>
1736 inline std::complex<_Tp>
1737 acosh(const std::complex<_Tp>& __z)
1738 { return __complex_acosh(__z); }
1739 #endif
1740
1741 template<typename _Tp>
1742 std::complex<_Tp>
1743 __complex_asinh(const std::complex<_Tp>& __z)
1744 {
1745 std::complex<_Tp> __t((__z.real() - __z.imag())
1746 * (__z.real() + __z.imag()) + _Tp(1.0),
1747 _Tp(2.0) * __z.real() * __z.imag());
1748 __t = std::sqrt(__t);
1749
1750 return std::log(__t + __z);
1751 }
1752
1753 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1754 inline __complex__ float
1755 __complex_asinh(__complex__ float __z)
1756 { return __builtin_casinhf(__z); }
1757
1758 inline __complex__ double
1759 __complex_asinh(__complex__ double __z)
1760 { return __builtin_casinh(__z); }
1761
1762 inline __complex__ long double
1763 __complex_asinh(const __complex__ long double& __z)
1764 { return __builtin_casinhl(__z); }
1765
1766 template<typename _Tp>
1767 inline std::complex<_Tp>
1768 asinh(const std::complex<_Tp>& __z)
1769 { return __complex_asinh(__z.__rep()); }
1770 #else
1771 /// asinh(__z) [8.1.6].
1772 // Effects: Behaves the same as C99 function casin, defined
1773 // in subclause 7.3.6.2.
1774 template<typename _Tp>
1775 inline std::complex<_Tp>
1776 asinh(const std::complex<_Tp>& __z)
1777 { return __complex_asinh(__z); }
1778 #endif
1779
1780 template<typename _Tp>
1781 std::complex<_Tp>
1782 __complex_atanh(const std::complex<_Tp>& __z)
1783 {
1784 const _Tp __i2 = __z.imag() * __z.imag();
1785 const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
1786
1787 _Tp __num = _Tp(1.0) + __z.real();
1788 _Tp __den = _Tp(1.0) - __z.real();
1789
1790 __num = __i2 + __num * __num;
1791 __den = __i2 + __den * __den;
1792
1793 return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)),
1794 _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
1795 }
1796
1797 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1798 inline __complex__ float
1799 __complex_atanh(__complex__ float __z)
1800 { return __builtin_catanhf(__z); }
1801
1802 inline __complex__ double
1803 __complex_atanh(__complex__ double __z)
1804 { return __builtin_catanh(__z); }
1805
1806 inline __complex__ long double
1807 __complex_atanh(const __complex__ long double& __z)
1808 { return __builtin_catanhl(__z); }
1809
1810 template<typename _Tp>
1811 inline std::complex<_Tp>
1812 atanh(const std::complex<_Tp>& __z)
1813 { return __complex_atanh(__z.__rep()); }
1814 #else
1815 /// atanh(__z) [8.1.7].
1816 // Effects: Behaves the same as C99 function catanh, defined
1817 // in subclause 7.3.6.3.
1818 template<typename _Tp>
1819 inline std::complex<_Tp>
1820 atanh(const std::complex<_Tp>& __z)
1821 { return __complex_atanh(__z); }
1822 #endif
1823
1824 template<typename _Tp>
1825 inline _Tp
1826 /// fabs(__z) [8.1.8].
1827 // Effects: Behaves the same as C99 function cabs, defined
1828 // in subclause 7.3.8.1.
1829 fabs(const std::complex<_Tp>& __z)
1830 { return std::abs(__z); }
1831
1832 /// Additional overloads [8.1.9].
1833 template<typename _Tp>
1834 inline typename __gnu_cxx::__promote<_Tp>::__type
1835 arg(_Tp __x)
1836 {
1837 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1838 #if (_GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC)
1839 return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L)
1840 : __type();
1841 #else
1842 return std::arg(std::complex<__type>(__x));
1843 #endif
1844 }
1845
1846 template<typename _Tp>
1847 inline typename __gnu_cxx::__promote<_Tp>::__type
1848 imag(_Tp)
1849 { return _Tp(); }
1850
1851 template<typename _Tp>
1852 inline typename __gnu_cxx::__promote<_Tp>::__type
1853 norm(_Tp __x)
1854 {
1855 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1856 return __type(__x) * __type(__x);
1857 }
1858
1859 template<typename _Tp>
1860 inline typename __gnu_cxx::__promote<_Tp>::__type
1861 real(_Tp __x)
1862 { return __x; }
1863
1864 template<typename _Tp, typename _Up>
1865 inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
1866 pow(const std::complex<_Tp>& __x, const _Up& __y)
1867 {
1868 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1869 return std::pow(std::complex<__type>(__x), __type(__y));
1870 }
1871
1872 template<typename _Tp, typename _Up>
1873 inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
1874 pow(const _Tp& __x, const std::complex<_Up>& __y)
1875 {
1876 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1877 return std::pow(__type(__x), std::complex<__type>(__y));
1878 }
1879
1880 template<typename _Tp, typename _Up>
1881 inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
1882 pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y)
1883 {
1884 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1885 return std::pow(std::complex<__type>(__x),
1886 std::complex<__type>(__y));
1887 }
1888
1889 // Forward declarations.
1890 // DR 781.
1891 template<typename _Tp> std::complex<_Tp> proj(const std::complex<_Tp>&);
1892
1893 template<typename _Tp>
1894 std::complex<_Tp>
1895 __complex_proj(const std::complex<_Tp>& __z)
1896 {
1897 const _Tp __den = (__z.real() * __z.real()
1898 + __z.imag() * __z.imag() + _Tp(1.0));
1899
1900 return std::complex<_Tp>((_Tp(2.0) * __z.real()) / __den,
1901 (_Tp(2.0) * __z.imag()) / __den);
1902 }
1903
1904 #if _GLIBCXX_USE_C99_COMPLEX
1905 inline __complex__ float
1906 __complex_proj(__complex__ float __z)
1907 { return __builtin_cprojf(__z); }
1908
1909 inline __complex__ double
1910 __complex_proj(__complex__ double __z)
1911 { return __builtin_cproj(__z); }
1912
1913 inline __complex__ long double
1914 __complex_proj(const __complex__ long double& __z)
1915 { return __builtin_cprojl(__z); }
1916
1917 template<typename _Tp>
1918 inline std::complex<_Tp>
1919 proj(const std::complex<_Tp>& __z)
1920 { return __complex_proj(__z.__rep()); }
1921 #else
1922 template<typename _Tp>
1923 inline std::complex<_Tp>
1924 proj(const std::complex<_Tp>& __z)
1925 { return __complex_proj(__z); }
1926 #endif
1927
1928 // DR 1137.
1929 template<typename _Tp>
1930 inline typename __gnu_cxx::__promote<_Tp>::__type
1931 proj(_Tp __x)
1932 { return __x; }
1933
1934 template<typename _Tp>
1935 inline typename __gnu_cxx::__promote<_Tp>::__type
1936 conj(_Tp __x)
1937 { return __x; }
1938
1939 _GLIBCXX_END_NAMESPACE_VERSION
1940 } // namespace
1941
1942 #endif // C++11
1943
1944 #endif /* _GLIBCXX_COMPLEX */
1945