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