For obj-c stage-final re-use the checksum from the previous stage
[official-gcc.git] / libstdc++-v3 / include / std / complex
blobc2f6421e0b7633084d1b19149031196d2edfca37
1 // The template and inlines for the -*- C++ -*- complex number classes.
3 // Copyright (C) 1997-2021 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.
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.
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.
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/>.
25 /** @file include/complex
26  *  This is a Standard C++ Library header.
27  */
30 // ISO C++ 14882: 26.2  Complex Numbers
31 // Note: this is not a conforming implementation.
32 // Initially implemented by Ulrich Drepper <drepper@cygnus.com>
33 // Improved by Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
36 #ifndef _GLIBCXX_COMPLEX
37 #define _GLIBCXX_COMPLEX 1
39 #pragma GCC system_header
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>
47 // Get rid of a macro possibly defined in <complex.h>
48 #undef complex
50 #if __cplusplus > 201703L
51 # define __cpp_lib_constexpr_complex 201711L
52 #endif
54 namespace std _GLIBCXX_VISIBILITY(default)
56 _GLIBCXX_BEGIN_NAMESPACE_VERSION
58   /**
59    * @defgroup complex_numbers Complex Numbers
60    * @ingroup numerics
61    *
62    * Classes and functions for complex numbers.
63    * @{
64    */
66   // Forward declarations.
67   template<typename _Tp> class complex;
68   template<> class complex<float>;
69   template<> class complex<double>;
70   template<> class complex<long double>;
72   ///  Return magnitude of @a z.
73   template<typename _Tp> _Tp abs(const complex<_Tp>&);
74   ///  Return phase angle of @a z.
75   template<typename _Tp> _Tp arg(const complex<_Tp>&);
76   ///  Return @a z magnitude squared.
77   template<typename _Tp> _Tp _GLIBCXX20_CONSTEXPR norm(const complex<_Tp>&);
79   ///  Return complex conjugate of @a z.
80   template<typename _Tp>
81     _GLIBCXX20_CONSTEXPR complex<_Tp> conj(const complex<_Tp>&);
82   ///  Return complex with magnitude @a rho and angle @a theta.
83   template<typename _Tp> complex<_Tp> polar(const _Tp&, const _Tp& = 0);
85   // Transcendentals:
86   /// Return complex cosine of @a z.
87   template<typename _Tp> complex<_Tp> cos(const complex<_Tp>&);
88   /// Return complex hyperbolic cosine of @a z.
89   template<typename _Tp> complex<_Tp> cosh(const complex<_Tp>&);
90   /// Return complex base e exponential of @a z.
91   template<typename _Tp> complex<_Tp> exp(const complex<_Tp>&);
92   /// Return complex natural logarithm of @a z.
93   template<typename _Tp> complex<_Tp> log(const complex<_Tp>&);
94   /// Return complex base 10 logarithm of @a z.
95   template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&);
96   /// Return @a x to the @a y'th power.
97   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int);
98   /// Return @a x to the @a y'th power.
99   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&);
100   /// Return @a x to the @a y'th power.
101   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&,
102                                           const complex<_Tp>&);
103   /// Return @a x to the @a y'th power.
104   template<typename _Tp> complex<_Tp> pow(const _Tp&, const complex<_Tp>&);
105   /// Return complex sine of @a z.
106   template<typename _Tp> complex<_Tp> sin(const complex<_Tp>&);
107   /// Return complex hyperbolic sine of @a z.
108   template<typename _Tp> complex<_Tp> sinh(const complex<_Tp>&);
109   /// Return complex square root of @a z.
110   template<typename _Tp> complex<_Tp> sqrt(const complex<_Tp>&);
111   /// Return complex tangent of @a z.
112   template<typename _Tp> complex<_Tp> tan(const complex<_Tp>&);
113   /// Return complex hyperbolic tangent of @a z.
114   template<typename _Tp> complex<_Tp> tanh(const complex<_Tp>&);
117   // 26.2.2  Primary template class complex
118   /**
119    *  Template to represent complex numbers.
120    *
121    *  Specializations for float, double, and long double are part of the
122    *  library.  Results with any other type are not guaranteed.
123    *
124    *  @param  Tp  Type of real and imaginary values.
125   */
126   template<typename _Tp>
127     class complex
128     {
129     public:
130       /// Value typedef.
131       typedef _Tp value_type;
133       ///  Default constructor.  First parameter is x, second parameter is y.
134       ///  Unspecified parameters default to 0.
135       _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
136       : _M_real(__r), _M_imag(__i) { }
138       // Let the compiler synthesize the copy constructor
139 #if __cplusplus >= 201103L
140       constexpr complex(const complex&) = default;
141 #endif
143       ///  Converting constructor.
144       template<typename _Up>
145         _GLIBCXX_CONSTEXPR complex(const complex<_Up>& __z)
146         : _M_real(__z.real()), _M_imag(__z.imag()) { }
148 #if __cplusplus >= 201103L
149       // _GLIBCXX_RESOLVE_LIB_DEFECTS
150       // DR 387. std::complex over-encapsulated.
151       _GLIBCXX_ABI_TAG_CXX11
152       constexpr _Tp
153       real() const { return _M_real; }
155       _GLIBCXX_ABI_TAG_CXX11
156       constexpr _Tp
157       imag() const { return _M_imag; }
158 #else
159       ///  Return real part of complex number.
160       _Tp&
161       real() { return _M_real; }
163       ///  Return real part of complex number.
164       const _Tp&
165       real() const { return _M_real; }
167       ///  Return imaginary part of complex number.
168       _Tp&
169       imag() { return _M_imag; }
171       ///  Return imaginary part of complex number.
172       const _Tp&
173       imag() const { return _M_imag; }
174 #endif
176       // _GLIBCXX_RESOLVE_LIB_DEFECTS
177       // DR 387. std::complex over-encapsulated.
178       _GLIBCXX20_CONSTEXPR void
179       real(_Tp __val) { _M_real = __val; }
181       _GLIBCXX20_CONSTEXPR void
182       imag(_Tp __val) { _M_imag = __val; }
184       /// Assign a scalar to this complex number.
185       _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const _Tp&);
187       /// Add a scalar to this complex number.
188       // 26.2.5/1
189       _GLIBCXX20_CONSTEXPR complex<_Tp>&
190       operator+=(const _Tp& __t)
191       {
192         _M_real += __t;
193         return *this;
194       }
196       /// Subtract a scalar from this complex number.
197       // 26.2.5/3
198       _GLIBCXX20_CONSTEXPR complex<_Tp>&
199       operator-=(const _Tp& __t)
200       {
201         _M_real -= __t;
202         return *this;
203       }
205       /// Multiply this complex number by a scalar.
206       _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const _Tp&);
207       /// Divide this complex number by a scalar.
208       _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const _Tp&);
210       // Let the compiler synthesize the copy assignment operator
211 #if __cplusplus >= 201103L
212       _GLIBCXX20_CONSTEXPR complex& operator=(const complex&) = default;
213 #endif
215       /// Assign another complex number to this one.
216       template<typename _Up>
217         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const complex<_Up>&);
218       /// Add another complex number to this one.
219       template<typename _Up>
220         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator+=(const complex<_Up>&);
221       /// Subtract another complex number from this one.
222       template<typename _Up>
223         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator-=(const complex<_Up>&);
224       /// Multiply this complex number by another.
225       template<typename _Up>
226         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const complex<_Up>&);
227       /// Divide this complex number by another.
228       template<typename _Up>
229         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const complex<_Up>&);
231       _GLIBCXX_CONSTEXPR complex __rep() const
232       { return *this; }
234     private:
235       _Tp _M_real;
236       _Tp _M_imag;
237     };
239   template<typename _Tp>
240     _GLIBCXX20_CONSTEXPR complex<_Tp>&
241     complex<_Tp>::operator=(const _Tp& __t)
242     {
243      _M_real = __t;
244      _M_imag = _Tp();
245      return *this;
246     }
248   // 26.2.5/5
249   template<typename _Tp>
250     _GLIBCXX20_CONSTEXPR complex<_Tp>&
251     complex<_Tp>::operator*=(const _Tp& __t)
252     {
253       _M_real *= __t;
254       _M_imag *= __t;
255       return *this;
256     }
258   // 26.2.5/7
259   template<typename _Tp>
260     _GLIBCXX20_CONSTEXPR complex<_Tp>&
261     complex<_Tp>::operator/=(const _Tp& __t)
262     {
263       _M_real /= __t;
264       _M_imag /= __t;
265       return *this;
266     }
268   template<typename _Tp>
269     template<typename _Up>
270     _GLIBCXX20_CONSTEXPR complex<_Tp>&
271     complex<_Tp>::operator=(const complex<_Up>& __z)
272     {
273       _M_real = __z.real();
274       _M_imag = __z.imag();
275       return *this;
276     }
278   // 26.2.5/9
279   template<typename _Tp>
280     template<typename _Up>
281     _GLIBCXX20_CONSTEXPR complex<_Tp>&
282     complex<_Tp>::operator+=(const complex<_Up>& __z)
283     {
284       _M_real += __z.real();
285       _M_imag += __z.imag();
286       return *this;
287     }
289   // 26.2.5/11
290   template<typename _Tp>
291     template<typename _Up>
292     _GLIBCXX20_CONSTEXPR complex<_Tp>&
293     complex<_Tp>::operator-=(const complex<_Up>& __z)
294     {
295       _M_real -= __z.real();
296       _M_imag -= __z.imag();
297       return *this;
298     }
300   // 26.2.5/13
301   // XXX: This is a grammar school implementation.
302   template<typename _Tp>
303     template<typename _Up>
304     _GLIBCXX20_CONSTEXPR complex<_Tp>&
305     complex<_Tp>::operator*=(const complex<_Up>& __z)
306     {
307       const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag();
308       _M_imag = _M_real * __z.imag() + _M_imag * __z.real();
309       _M_real = __r;
310       return *this;
311     }
313   // 26.2.5/15
314   // XXX: This is a grammar school implementation.
315   template<typename _Tp>
316     template<typename _Up>
317     _GLIBCXX20_CONSTEXPR complex<_Tp>&
318     complex<_Tp>::operator/=(const complex<_Up>& __z)
319     {
320       const _Tp __r =  _M_real * __z.real() + _M_imag * __z.imag();
321       const _Tp __n = std::norm(__z);
322       _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n;
323       _M_real = __r / __n;
324       return *this;
325     }
327   // Operators:
328   ///@{
329   ///  Return new complex value @a x plus @a y.
330   template<typename _Tp>
331     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
332     operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
333     {
334       complex<_Tp> __r = __x;
335       __r += __y;
336       return __r;
337     }
339   template<typename _Tp>
340     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
341     operator+(const complex<_Tp>& __x, const _Tp& __y)
342     {
343       complex<_Tp> __r = __x;
344       __r += __y;
345       return __r;
346     }
348   template<typename _Tp>
349     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
350     operator+(const _Tp& __x, const complex<_Tp>& __y)
351     {
352       complex<_Tp> __r = __y;
353       __r += __x;
354       return __r;
355     }
356   ///@}
358   ///@{
359   ///  Return new complex value @a x minus @a y.
360   template<typename _Tp>
361     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
362     operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
363     {
364       complex<_Tp> __r = __x;
365       __r -= __y;
366       return __r;
367     }
369   template<typename _Tp>
370     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
371     operator-(const complex<_Tp>& __x, const _Tp& __y)
372     {
373       complex<_Tp> __r = __x;
374       __r -= __y;
375       return __r;
376     }
378   template<typename _Tp>
379     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
380     operator-(const _Tp& __x, const complex<_Tp>& __y)
381     {
382       complex<_Tp> __r = -__y;
383       __r += __x;
384       return __r;
385     }
386   ///@}
388   ///@{
389   ///  Return new complex value @a x times @a y.
390   template<typename _Tp>
391     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
392     operator*(const complex<_Tp>& __x, const complex<_Tp>& __y)
393     {
394       complex<_Tp> __r = __x;
395       __r *= __y;
396       return __r;
397     }
399   template<typename _Tp>
400     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
401     operator*(const complex<_Tp>& __x, const _Tp& __y)
402     {
403       complex<_Tp> __r = __x;
404       __r *= __y;
405       return __r;
406     }
408   template<typename _Tp>
409     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
410     operator*(const _Tp& __x, const complex<_Tp>& __y)
411     {
412       complex<_Tp> __r = __y;
413       __r *= __x;
414       return __r;
415     }
416   ///@}
418   ///@{
419   ///  Return new complex value @a x divided by @a y.
420   template<typename _Tp>
421     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
422     operator/(const complex<_Tp>& __x, const complex<_Tp>& __y)
423     {
424       complex<_Tp> __r = __x;
425       __r /= __y;
426       return __r;
427     }
429   template<typename _Tp>
430     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
431     operator/(const complex<_Tp>& __x, const _Tp& __y)
432     {
433       complex<_Tp> __r = __x;
434       __r /= __y;
435       return __r;
436     }
438   template<typename _Tp>
439     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
440     operator/(const _Tp& __x, const complex<_Tp>& __y)
441     {
442       complex<_Tp> __r = __x;
443       __r /= __y;
444       return __r;
445     }
446   ///@}
448   ///  Return @a x.
449   template<typename _Tp>
450     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
451     operator+(const complex<_Tp>& __x)
452     { return __x; }
454   ///  Return complex negation of @a x.
455   template<typename _Tp>
456     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
457     operator-(const complex<_Tp>& __x)
458     { return complex<_Tp>(-__x.real(), -__x.imag()); }
460   ///@{
461   ///  Return true if @a x is equal to @a y.
462   template<typename _Tp>
463     inline _GLIBCXX_CONSTEXPR bool
464     operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
465     { return __x.real() == __y.real() && __x.imag() == __y.imag(); }
467   template<typename _Tp>
468     inline _GLIBCXX_CONSTEXPR bool
469     operator==(const complex<_Tp>& __x, const _Tp& __y)
470     { return __x.real() == __y && __x.imag() == _Tp(); }
472 #if !(__cpp_impl_three_way_comparison >= 201907L)
473   template<typename _Tp>
474     inline _GLIBCXX_CONSTEXPR bool
475     operator==(const _Tp& __x, const complex<_Tp>& __y)
476     { return __x == __y.real() && _Tp() == __y.imag(); }
477   ///@}
479   ///@{
480   ///  Return false if @a x is equal to @a y.
481   template<typename _Tp>
482     inline _GLIBCXX_CONSTEXPR bool
483     operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
484     { return __x.real() != __y.real() || __x.imag() != __y.imag(); }
486   template<typename _Tp>
487     inline _GLIBCXX_CONSTEXPR bool
488     operator!=(const complex<_Tp>& __x, const _Tp& __y)
489     { return __x.real() != __y || __x.imag() != _Tp(); }
491   template<typename _Tp>
492     inline _GLIBCXX_CONSTEXPR bool
493     operator!=(const _Tp& __x, const complex<_Tp>& __y)
494     { return __x != __y.real() || _Tp() != __y.imag(); }
495 #endif
496   ///@}
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       bool __fail = true;
504       _CharT __ch;
505       if (__is >> __ch)
506         {
507           if (_Traits::eq(__ch, __is.widen('(')))
508             {
509               _Tp __u;
510               if (__is >> __u >> __ch)
511                 {
512                   const _CharT __rparen = __is.widen(')');
513                   if (_Traits::eq(__ch, __rparen))
514                     {
515                       __x = __u;
516                       __fail = false;
517                     }
518                   else if (_Traits::eq(__ch, __is.widen(',')))
519                     {
520                       _Tp __v;
521                       if (__is >> __v >> __ch)
522                         {
523                           if (_Traits::eq(__ch, __rparen))
524                             {
525                               __x = complex<_Tp>(__u, __v);
526                               __fail = false;
527                             }
528                           else
529                             __is.putback(__ch);
530                         }
531                     }
532                   else
533                     __is.putback(__ch);
534                 }
535             }
536           else
537             {
538               __is.putback(__ch);
539               _Tp __u;
540               if (__is >> __u)
541                 {
542                   __x = __u;
543                   __fail = false;
544                 }
545             }
546         }
547       if (__fail)
548         __is.setstate(ios_base::failbit);
549       return __is;
550     }
552   ///  Insertion operator for complex values.
553   template<typename _Tp, typename _CharT, class _Traits>
554     basic_ostream<_CharT, _Traits>&
555     operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
556     {
557       basic_ostringstream<_CharT, _Traits> __s;
558       __s.flags(__os.flags());
559       __s.imbue(__os.getloc());
560       __s.precision(__os.precision());
561       __s << '(' << __x.real() << ',' << __x.imag() << ')';
562       return __os << __s.str();
563     }
565   // Values
566 #if __cplusplus >= 201103L
567   template<typename _Tp>
568     constexpr _Tp
569     real(const complex<_Tp>& __z)
570     { return __z.real(); }
572   template<typename _Tp>
573     constexpr _Tp
574     imag(const complex<_Tp>& __z)
575     { return __z.imag(); }
576 #else
577   template<typename _Tp>
578     inline _Tp&
579     real(complex<_Tp>& __z)
580     { return __z.real(); }
582   template<typename _Tp>
583     inline const _Tp&
584     real(const complex<_Tp>& __z)
585     { return __z.real(); }
587   template<typename _Tp>
588     inline _Tp&
589     imag(complex<_Tp>& __z)
590     { return __z.imag(); }
592   template<typename _Tp>
593     inline const _Tp&
594     imag(const complex<_Tp>& __z)
595     { return __z.imag(); }
596 #endif
598   // 26.2.7/3 abs(__z):  Returns the magnitude of __z.
599   template<typename _Tp>
600     inline _Tp
601     __complex_abs(const complex<_Tp>& __z)
602     {
603       _Tp __x = __z.real();
604       _Tp __y = __z.imag();
605       const _Tp __s = std::max(abs(__x), abs(__y));
606       if (__s == _Tp())  // well ...
607         return __s;
608       __x /= __s;
609       __y /= __s;
610       return __s * sqrt(__x * __x + __y * __y);
611     }
613 #if _GLIBCXX_USE_C99_COMPLEX
614   inline float
615   __complex_abs(__complex__ float __z) { return __builtin_cabsf(__z); }
617   inline double
618   __complex_abs(__complex__ double __z) { return __builtin_cabs(__z); }
620   inline long double
621   __complex_abs(const __complex__ long double& __z)
622   { return __builtin_cabsl(__z); }
624   template<typename _Tp>
625     inline _Tp
626     abs(const complex<_Tp>& __z) { return __complex_abs(__z.__rep()); }
627 #else
628   template<typename _Tp>
629     inline _Tp
630     abs(const complex<_Tp>& __z) { return __complex_abs(__z); }
631 #endif
634   // 26.2.7/4: arg(__z): Returns the phase angle of __z.
635   template<typename _Tp>
636     inline _Tp
637     __complex_arg(const complex<_Tp>& __z)
638     { return  atan2(__z.imag(), __z.real()); }
640 #if _GLIBCXX_USE_C99_COMPLEX
641   inline float
642   __complex_arg(__complex__ float __z) { return __builtin_cargf(__z); }
644   inline double
645   __complex_arg(__complex__ double __z) { return __builtin_carg(__z); }
647   inline long double
648   __complex_arg(const __complex__ long double& __z)
649   { return __builtin_cargl(__z); }
651   template<typename _Tp>
652     inline _Tp
653     arg(const complex<_Tp>& __z) { return __complex_arg(__z.__rep()); }
654 #else
655   template<typename _Tp>
656     inline _Tp
657     arg(const complex<_Tp>& __z) { return __complex_arg(__z); }
658 #endif
660   // 26.2.7/5: norm(__z) returns the squared magnitude of __z.
661   //     As defined, norm() is -not- a norm is the common mathematical
662   //     sense used in numerics.  The helper class _Norm_helper<> tries to
663   //     distinguish between builtin floating point and the rest, so as
664   //     to deliver an answer as close as possible to the real value.
665   template<bool>
666     struct _Norm_helper
667     {
668       template<typename _Tp>
669         static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z)
670         {
671           const _Tp __x = __z.real();
672           const _Tp __y = __z.imag();
673           return __x * __x + __y * __y;
674         }
675     };
677   template<>
678     struct _Norm_helper<true>
679     {
680       template<typename _Tp>
681         static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z)
682         {
683           //_Tp __res = std::abs(__z);
684           //return __res * __res;
685           const _Tp __x = __z.real();
686           const _Tp __y = __z.imag();
687           return __x * __x + __y * __y;
688         }
689     };
691   template<typename _Tp>
692     inline _GLIBCXX20_CONSTEXPR _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     }
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     }
707   template<typename _Tp>
708     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
709     conj(const complex<_Tp>& __z)
710     { return complex<_Tp>(__z.real(), -__z.imag()); }
712   // Transcendentals
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     }
724 #if _GLIBCXX_USE_C99_COMPLEX
725   inline __complex__ float
726   __complex_cos(__complex__ float __z) { return __builtin_ccosf(__z); }
728   inline __complex__ double
729   __complex_cos(__complex__ double __z) { return __builtin_ccos(__z); }
731   inline __complex__ long double
732   __complex_cos(const __complex__ long double& __z)
733   { return __builtin_ccosl(__z); }
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
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     }
754 #if _GLIBCXX_USE_C99_COMPLEX
755   inline __complex__ float
756   __complex_cosh(__complex__ float __z) { return __builtin_ccoshf(__z); }
758   inline __complex__ double
759   __complex_cosh(__complex__ double __z) { return __builtin_ccosh(__z); }
761   inline __complex__ long double
762   __complex_cosh(const __complex__ long double& __z)
763   { return __builtin_ccoshl(__z); }
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
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()); }
780 #if _GLIBCXX_USE_C99_COMPLEX
781   inline __complex__ float
782   __complex_exp(__complex__ float __z) { return __builtin_cexpf(__z); }
784   inline __complex__ double
785   __complex_exp(__complex__ double __z) { return __builtin_cexp(__z); }
787   inline __complex__ long double
788   __complex_exp(const __complex__ long double& __z)
789   { return __builtin_cexpl(__z); }
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
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)); }
807 #if _GLIBCXX_USE_C99_COMPLEX
808   inline __complex__ float
809   __complex_log(__complex__ float __z) { return __builtin_clogf(__z); }
811   inline __complex__ double
812   __complex_log(__complex__ double __z) { return __builtin_clog(__z); }
814   inline __complex__ long double
815   __complex_log(const __complex__ long double& __z)
816   { return __builtin_clogl(__z); }
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
827   template<typename _Tp>
828     inline complex<_Tp>
829     log10(const complex<_Tp>& __z)
830     { return std::log(__z) / log(_Tp(10.0)); }
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     }
842 #if _GLIBCXX_USE_C99_COMPLEX
843   inline __complex__ float
844   __complex_sin(__complex__ float __z) { return __builtin_csinf(__z); }
846   inline __complex__ double
847   __complex_sin(__complex__ double __z) { return __builtin_csin(__z); }
849   inline __complex__ long double
850   __complex_sin(const __complex__ long double& __z)
851   { return __builtin_csinl(__z); }
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
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     }
872 #if _GLIBCXX_USE_C99_COMPLEX
873   inline __complex__ float
874   __complex_sinh(__complex__ float __z) { return __builtin_csinhf(__z); }
876   inline __complex__ double
877   __complex_sinh(__complex__ double __z) { return __builtin_csinh(__z); }
879   inline __complex__ long double
880   __complex_sinh(const __complex__ long double& __z)
881   { return __builtin_csinhl(__z); }
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
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();
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     }
916 #if _GLIBCXX_USE_C99_COMPLEX
917   inline __complex__ float
918   __complex_sqrt(__complex__ float __z) { return __builtin_csqrtf(__z); }
920   inline __complex__ double
921   __complex_sqrt(__complex__ double __z) { return __builtin_csqrt(__z); }
923   inline __complex__ long double
924   __complex_sqrt(const __complex__ long double& __z)
925   { return __builtin_csqrtl(__z); }
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
936   // 26.2.8/14 tan(__z):  Return the complex tangent of __z.
938   template<typename _Tp>
939     inline complex<_Tp>
940     __complex_tan(const complex<_Tp>& __z)
941     { return std::sin(__z) / std::cos(__z); }
943 #if _GLIBCXX_USE_C99_COMPLEX
944   inline __complex__ float
945   __complex_tan(__complex__ float __z) { return __builtin_ctanf(__z); }
947   inline __complex__ double
948   __complex_tan(__complex__ double __z) { return __builtin_ctan(__z); }
950   inline __complex__ long double
951   __complex_tan(const __complex__ long double& __z)
952   { return __builtin_ctanl(__z); }
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
964   // 26.2.8/15 tanh(__z):  Returns the hyperbolic tangent of __z.
966   template<typename _Tp>
967     inline complex<_Tp>
968     __complex_tanh(const complex<_Tp>& __z)
969     { return std::sinh(__z) / std::cosh(__z); }
971 #if _GLIBCXX_USE_C99_COMPLEX
972   inline __complex__ float
973   __complex_tanh(__complex__ float __z) { return __builtin_ctanhf(__z); }
975   inline __complex__ double
976   __complex_tanh(__complex__ double __z) { return __builtin_ctanh(__z); }
978   inline __complex__ long double
979   __complex_tanh(const __complex__ long double& __z)
980   { return __builtin_ctanhl(__z); }
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
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);
1001       while (__n >>= 1)
1002         {
1003           __x *= __x;
1004           if (__n % 2)
1005             __y *= __x;
1006         }
1008       return __y;
1009     }
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     }
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);
1037       complex<_Tp> __t = std::log(__x);
1038       return std::polar<_Tp>(exp(__y * __t.real()), __y * __t.imag());
1039     }
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)); }
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); }
1051   inline __complex__ double
1052   __complex_pow(__complex__ double __x, __complex__ double __y)
1053   { return __builtin_cpow(__x, __y); }
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); }
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
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     }
1080   /// 26.2.3  complex specializations
1081   /// complex<float> specialization
1082   template<>
1083     class complex<float>
1084     {
1085     public:
1086       typedef float value_type;
1087       typedef __complex__ float _ComplexT;
1089       _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
1091       _GLIBCXX_CONSTEXPR complex(float __r = 0.0f, float __i = 0.0f)
1092 #if __cplusplus >= 201103L
1093       : _M_value{ __r, __i } { }
1094 #else
1095       {
1096         __real__ _M_value = __r;
1097         __imag__ _M_value = __i;
1098       }
1099 #endif
1101       explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&);
1102       explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
1104 #if __cplusplus >= 201103L
1105       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1106       // DR 387. std::complex over-encapsulated.
1107       __attribute ((__abi_tag__ ("cxx11")))
1108       constexpr float
1109       real() const { return __real__ _M_value; }
1111       __attribute ((__abi_tag__ ("cxx11")))
1112       constexpr float
1113       imag() const { return __imag__ _M_value; }
1114 #else
1115       float&
1116       real() { return __real__ _M_value; }
1118       const float&
1119       real() const { return __real__ _M_value; }
1121       float&
1122       imag() { return __imag__ _M_value; }
1124       const float&
1125       imag() const { return __imag__ _M_value; }
1126 #endif
1128       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1129       // DR 387. std::complex over-encapsulated.
1130       _GLIBCXX20_CONSTEXPR void
1131       real(float __val) { __real__ _M_value = __val; }
1133       _GLIBCXX20_CONSTEXPR void
1134       imag(float __val) { __imag__ _M_value = __val; }
1136       _GLIBCXX20_CONSTEXPR complex&
1137       operator=(float __f)
1138       {
1139         _M_value = __f;
1140         return *this;
1141       }
1143       _GLIBCXX20_CONSTEXPR complex&
1144       operator+=(float __f)
1145       {
1146         _M_value += __f;
1147         return *this;
1148       }
1150       _GLIBCXX20_CONSTEXPR complex&
1151       operator-=(float __f)
1152       {
1153         _M_value -= __f;
1154         return *this;
1155       }
1157       _GLIBCXX20_CONSTEXPR complex&
1158       operator*=(float __f)
1159       {
1160         _M_value *= __f;
1161         return *this;
1162       }
1164       _GLIBCXX20_CONSTEXPR complex&
1165       operator/=(float __f)
1166       {
1167         _M_value /= __f;
1168         return *this;
1169       }
1171       // Let the compiler synthesize the copy and assignment
1172       // operator.  It always does a pretty good job.
1173 #if __cplusplus >= 201103L
1174       _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
1175 #endif
1177       template<typename _Tp>
1178         _GLIBCXX20_CONSTEXPR complex&
1179         operator=(const complex<_Tp>&  __z)
1180         {
1181           __real__ _M_value = __z.real();
1182           __imag__ _M_value = __z.imag();
1183           return *this;
1184         }
1186       template<typename _Tp>
1187         _GLIBCXX20_CONSTEXPR complex&
1188         operator+=(const complex<_Tp>& __z)
1189         {
1190           _M_value += __z.__rep();
1191           return *this;
1192         }
1194       template<class _Tp>
1195         _GLIBCXX20_CONSTEXPR complex&
1196         operator-=(const complex<_Tp>& __z)
1197         {
1198           _M_value -= __z.__rep();
1199           return *this;
1200         }
1202       template<class _Tp>
1203         _GLIBCXX20_CONSTEXPR complex&
1204         operator*=(const complex<_Tp>& __z)
1205         {
1206           const _ComplexT __t = __z.__rep();
1207           _M_value *= __t;
1208           return *this;
1209         }
1211       template<class _Tp>
1212         _GLIBCXX20_CONSTEXPR complex&
1213         operator/=(const complex<_Tp>& __z)
1214         {
1215           const _ComplexT __t = __z.__rep();
1216           _M_value /= __t;
1217           return *this;
1218         }
1220       _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
1222     private:
1223       _ComplexT _M_value;
1224     };
1226   /// 26.2.3  complex specializations
1227   /// complex<double> specialization
1228   template<>
1229     class complex<double>
1230     {
1231     public:
1232       typedef double value_type;
1233       typedef __complex__ double _ComplexT;
1235       _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
1237       _GLIBCXX_CONSTEXPR complex(double __r = 0.0, double __i = 0.0)
1238 #if __cplusplus >= 201103L
1239       : _M_value{ __r, __i } { }
1240 #else
1241       {
1242         __real__ _M_value = __r;
1243         __imag__ _M_value = __i;
1244       }
1245 #endif
1247       _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
1248       : _M_value(__z.__rep()) { }
1250       explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
1252 #if __cplusplus >= 201103L
1253       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1254       // DR 387. std::complex over-encapsulated.
1255       __attribute ((__abi_tag__ ("cxx11")))
1256       constexpr double
1257       real() const { return __real__ _M_value; }
1259       __attribute ((__abi_tag__ ("cxx11")))
1260       constexpr double
1261       imag() const { return __imag__ _M_value; }
1262 #else
1263       double&
1264       real() { return __real__ _M_value; }
1266       const double&
1267       real() const { return __real__ _M_value; }
1269       double&
1270       imag() { return __imag__ _M_value; }
1272       const double&
1273       imag() const { return __imag__ _M_value; }
1274 #endif
1276       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1277       // DR 387. std::complex over-encapsulated.
1278       _GLIBCXX20_CONSTEXPR void
1279       real(double __val) { __real__ _M_value = __val; }
1281       _GLIBCXX20_CONSTEXPR void
1282       imag(double __val) { __imag__ _M_value = __val; }
1284       _GLIBCXX20_CONSTEXPR complex&
1285       operator=(double __d)
1286       {
1287         _M_value = __d;
1288         return *this;
1289       }
1291       _GLIBCXX20_CONSTEXPR complex&
1292       operator+=(double __d)
1293       {
1294         _M_value += __d;
1295         return *this;
1296       }
1298       _GLIBCXX20_CONSTEXPR complex&
1299       operator-=(double __d)
1300       {
1301         _M_value -= __d;
1302         return *this;
1303       }
1305       _GLIBCXX20_CONSTEXPR complex&
1306       operator*=(double __d)
1307       {
1308         _M_value *= __d;
1309         return *this;
1310       }
1312       _GLIBCXX20_CONSTEXPR complex&
1313       operator/=(double __d)
1314       {
1315         _M_value /= __d;
1316         return *this;
1317       }
1319       // The compiler will synthesize this, efficiently.
1320 #if __cplusplus >= 201103L
1321       _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
1322 #endif
1324       template<typename _Tp>
1325         _GLIBCXX20_CONSTEXPR complex&
1326         operator=(const complex<_Tp>& __z)
1327         {
1328           _M_value = __z.__rep();
1329           return *this;
1330         }
1332       template<typename _Tp>
1333         _GLIBCXX20_CONSTEXPR complex&
1334         operator+=(const complex<_Tp>& __z)
1335         {
1336           _M_value += __z.__rep();
1337           return *this;
1338         }
1340       template<typename _Tp>
1341         _GLIBCXX20_CONSTEXPR complex&
1342         operator-=(const complex<_Tp>& __z)
1343         {
1344           _M_value -= __z.__rep();
1345           return *this;
1346         }
1348       template<typename _Tp>
1349         _GLIBCXX20_CONSTEXPR complex&
1350         operator*=(const complex<_Tp>& __z)
1351         {
1352           const _ComplexT __t = __z.__rep();
1353           _M_value *= __t;
1354           return *this;
1355         }
1357       template<typename _Tp>
1358         _GLIBCXX20_CONSTEXPR complex&
1359         operator/=(const complex<_Tp>& __z)
1360         {
1361           const _ComplexT __t = __z.__rep();
1362           _M_value /= __t;
1363           return *this;
1364         }
1366       _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
1368     private:
1369       _ComplexT _M_value;
1370     };
1372   /// 26.2.3  complex specializations
1373   /// complex<long double> specialization
1374   template<>
1375     class complex<long double>
1376     {
1377     public:
1378       typedef long double value_type;
1379       typedef __complex__ long double _ComplexT;
1381       _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
1383       _GLIBCXX_CONSTEXPR complex(long double __r = 0.0L,
1384                                  long double __i = 0.0L)
1385 #if __cplusplus >= 201103L
1386       : _M_value{ __r, __i } { }
1387 #else
1388       {
1389         __real__ _M_value = __r;
1390         __imag__ _M_value = __i;
1391       }
1392 #endif
1394       _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
1395       : _M_value(__z.__rep()) { }
1397       _GLIBCXX_CONSTEXPR complex(const complex<double>& __z)
1398       : _M_value(__z.__rep()) { }
1400 #if __cplusplus >= 201103L
1401       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1402       // DR 387. std::complex over-encapsulated.
1403       __attribute ((__abi_tag__ ("cxx11")))
1404       constexpr long double
1405       real() const { return __real__ _M_value; }
1407       __attribute ((__abi_tag__ ("cxx11")))
1408       constexpr long double
1409       imag() const { return __imag__ _M_value; }
1410 #else
1411       long double&
1412       real() { return __real__ _M_value; }
1414       const long double&
1415       real() const { return __real__ _M_value; }
1417       long double&
1418       imag() { return __imag__ _M_value; }
1420       const long double&
1421       imag() const { return __imag__ _M_value; }
1422 #endif
1424       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1425       // DR 387. std::complex over-encapsulated.
1426       _GLIBCXX20_CONSTEXPR void
1427       real(long double __val) { __real__ _M_value = __val; }
1429       _GLIBCXX20_CONSTEXPR void
1430       imag(long double __val) { __imag__ _M_value = __val; }
1432       _GLIBCXX20_CONSTEXPR complex&
1433       operator=(long double __r)
1434       {
1435         _M_value = __r;
1436         return *this;
1437       }
1439       _GLIBCXX20_CONSTEXPR complex&
1440       operator+=(long double __r)
1441       {
1442         _M_value += __r;
1443         return *this;
1444       }
1446       _GLIBCXX20_CONSTEXPR complex&
1447       operator-=(long double __r)
1448       {
1449         _M_value -= __r;
1450         return *this;
1451       }
1453       _GLIBCXX20_CONSTEXPR complex&
1454       operator*=(long double __r)
1455       {
1456         _M_value *= __r;
1457         return *this;
1458       }
1460       _GLIBCXX20_CONSTEXPR complex&
1461       operator/=(long double __r)
1462       {
1463         _M_value /= __r;
1464         return *this;
1465       }
1467       // The compiler knows how to do this efficiently
1468 #if __cplusplus >= 201103L
1469       _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
1470 #endif
1472       template<typename _Tp>
1473         _GLIBCXX20_CONSTEXPR complex&
1474         operator=(const complex<_Tp>& __z)
1475         {
1476           _M_value = __z.__rep();
1477           return *this;
1478         }
1480       template<typename _Tp>
1481         _GLIBCXX20_CONSTEXPR complex&
1482         operator+=(const complex<_Tp>& __z)
1483         {
1484           _M_value += __z.__rep();
1485           return *this;
1486         }
1488       template<typename _Tp>
1489         _GLIBCXX20_CONSTEXPR complex&
1490         operator-=(const complex<_Tp>& __z)
1491         {
1492           _M_value -= __z.__rep();
1493           return *this;
1494         }
1496       template<typename _Tp>
1497         _GLIBCXX20_CONSTEXPR complex&
1498         operator*=(const complex<_Tp>& __z)
1499         {
1500           const _ComplexT __t = __z.__rep();
1501           _M_value *= __t;
1502           return *this;
1503         }
1505       template<typename _Tp>
1506         _GLIBCXX20_CONSTEXPR complex&
1507         operator/=(const complex<_Tp>& __z)
1508         {
1509           const _ComplexT __t = __z.__rep();
1510           _M_value /= __t;
1511           return *this;
1512         }
1514       _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
1516     private:
1517       _ComplexT _M_value;
1518     };
1520   // These bits have to be at the end of this file, so that the
1521   // specializations have all been defined.
1522   inline _GLIBCXX_CONSTEXPR
1523   complex<float>::complex(const complex<double>& __z)
1524   : _M_value(__z.__rep()) { }
1526   inline _GLIBCXX_CONSTEXPR
1527   complex<float>::complex(const complex<long double>& __z)
1528   : _M_value(__z.__rep()) { }
1530   inline _GLIBCXX_CONSTEXPR
1531   complex<double>::complex(const complex<long double>& __z)
1532   : _M_value(__z.__rep()) { }
1534   // Inhibit implicit instantiations for required instantiations,
1535   // which are defined via explicit instantiations elsewhere.
1536   // NB:  This syntax is a GNU extension.
1537 #if _GLIBCXX_EXTERN_TEMPLATE
1538   extern template istream& operator>>(istream&, complex<float>&);
1539   extern template ostream& operator<<(ostream&, const complex<float>&);
1540   extern template istream& operator>>(istream&, complex<double>&);
1541   extern template ostream& operator<<(ostream&, const complex<double>&);
1542   extern template istream& operator>>(istream&, complex<long double>&);
1543   extern template ostream& operator<<(ostream&, const complex<long double>&);
1545 #ifdef _GLIBCXX_USE_WCHAR_T
1546   extern template wistream& operator>>(wistream&, complex<float>&);
1547   extern template wostream& operator<<(wostream&, const complex<float>&);
1548   extern template wistream& operator>>(wistream&, complex<double>&);
1549   extern template wostream& operator<<(wostream&, const complex<double>&);
1550   extern template wistream& operator>>(wistream&, complex<long double>&);
1551   extern template wostream& operator<<(wostream&, const complex<long double>&);
1552 #endif
1553 #endif
1555   /// @} group complex_numbers
1557 _GLIBCXX_END_NAMESPACE_VERSION
1558 } // namespace
1560 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
1562 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1564   // See ext/type_traits.h for the primary template.
1565   template<typename _Tp, typename _Up>
1566     struct __promote_2<std::complex<_Tp>, _Up>
1567     {
1568     public:
1569       typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
1570     };
1572   template<typename _Tp, typename _Up>
1573     struct __promote_2<_Tp, std::complex<_Up> >
1574     {
1575     public:
1576       typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
1577     };
1579   template<typename _Tp, typename _Up>
1580     struct __promote_2<std::complex<_Tp>, std::complex<_Up> >
1581     {
1582     public:
1583       typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
1584     };
1586 _GLIBCXX_END_NAMESPACE_VERSION
1587 } // namespace
1589 #if __cplusplus >= 201103L
1591 namespace std _GLIBCXX_VISIBILITY(default)
1593 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1595   // Forward declarations.
1596   template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&);
1597   template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&);
1598   template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&);
1600   template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&);
1601   template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&);
1602   template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&);
1603   // DR 595.
1604   template<typename _Tp> _Tp               fabs(const std::complex<_Tp>&);
1606   template<typename _Tp>
1607     inline std::complex<_Tp>
1608     __complex_acos(const std::complex<_Tp>& __z)
1609     {
1610       const std::complex<_Tp> __t = std::asin(__z);
1611       const _Tp __pi_2 = 1.5707963267948966192313216916397514L;
1612       return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
1613     }
1615 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1616   inline __complex__ float
1617   __complex_acos(__complex__ float __z)
1618   { return __builtin_cacosf(__z); }
1620   inline __complex__ double
1621   __complex_acos(__complex__ double __z)
1622   { return __builtin_cacos(__z); }
1624   inline __complex__ long double
1625   __complex_acos(const __complex__ long double& __z)
1626   { return __builtin_cacosl(__z); }
1628   template<typename _Tp>
1629     inline std::complex<_Tp>
1630     acos(const std::complex<_Tp>& __z)
1631     { return __complex_acos(__z.__rep()); }
1632 #else
1633   /// acos(__z) [8.1.2].
1634   //  Effects:  Behaves the same as C99 function cacos, defined
1635   //            in subclause 7.3.5.1.
1636   template<typename _Tp>
1637     inline std::complex<_Tp>
1638     acos(const std::complex<_Tp>& __z)
1639     { return __complex_acos(__z); }
1640 #endif
1642   template<typename _Tp>
1643     inline std::complex<_Tp>
1644     __complex_asin(const std::complex<_Tp>& __z)
1645     {
1646       std::complex<_Tp> __t(-__z.imag(), __z.real());
1647       __t = std::asinh(__t);
1648       return std::complex<_Tp>(__t.imag(), -__t.real());
1649     }
1651 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1652   inline __complex__ float
1653   __complex_asin(__complex__ float __z)
1654   { return __builtin_casinf(__z); }
1656   inline __complex__ double
1657   __complex_asin(__complex__ double __z)
1658   { return __builtin_casin(__z); }
1660   inline __complex__ long double
1661   __complex_asin(const __complex__ long double& __z)
1662   { return __builtin_casinl(__z); }
1664   template<typename _Tp>
1665     inline std::complex<_Tp>
1666     asin(const std::complex<_Tp>& __z)
1667     { return __complex_asin(__z.__rep()); }
1668 #else
1669   /// asin(__z) [8.1.3].
1670   //  Effects:  Behaves the same as C99 function casin, defined
1671   //            in subclause 7.3.5.2.
1672   template<typename _Tp>
1673     inline std::complex<_Tp>
1674     asin(const std::complex<_Tp>& __z)
1675     { return __complex_asin(__z); }
1676 #endif
1678   template<typename _Tp>
1679     std::complex<_Tp>
1680     __complex_atan(const std::complex<_Tp>& __z)
1681     {
1682       const _Tp __r2 = __z.real() * __z.real();
1683       const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
1685       _Tp __num = __z.imag() + _Tp(1.0);
1686       _Tp __den = __z.imag() - _Tp(1.0);
1688       __num = __r2 + __num * __num;
1689       __den = __r2 + __den * __den;
1691       return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x),
1692                                _Tp(0.25) * log(__num / __den));
1693     }
1695 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1696   inline __complex__ float
1697   __complex_atan(__complex__ float __z)
1698   { return __builtin_catanf(__z); }
1700   inline __complex__ double
1701   __complex_atan(__complex__ double __z)
1702   { return __builtin_catan(__z); }
1704   inline __complex__ long double
1705   __complex_atan(const __complex__ long double& __z)
1706   { return __builtin_catanl(__z); }
1708   template<typename _Tp>
1709     inline std::complex<_Tp>
1710     atan(const std::complex<_Tp>& __z)
1711     { return __complex_atan(__z.__rep()); }
1712 #else
1713   /// atan(__z) [8.1.4].
1714   //  Effects:  Behaves the same as C99 function catan, defined
1715   //            in subclause 7.3.5.3.
1716   template<typename _Tp>
1717     inline std::complex<_Tp>
1718     atan(const std::complex<_Tp>& __z)
1719     { return __complex_atan(__z); }
1720 #endif
1722   template<typename _Tp>
1723     std::complex<_Tp>
1724     __complex_acosh(const std::complex<_Tp>& __z)
1725     {
1726       // Kahan's formula.
1727       return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0)))
1728                                  + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
1729     }
1731 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1732   inline __complex__ float
1733   __complex_acosh(__complex__ float __z)
1734   { return __builtin_cacoshf(__z); }
1736   inline __complex__ double
1737   __complex_acosh(__complex__ double __z)
1738   { return __builtin_cacosh(__z); }
1740   inline __complex__ long double
1741   __complex_acosh(const __complex__ long double& __z)
1742   { return __builtin_cacoshl(__z); }
1744   template<typename _Tp>
1745     inline std::complex<_Tp>
1746     acosh(const std::complex<_Tp>& __z)
1747     { return __complex_acosh(__z.__rep()); }
1748 #else
1749   /// acosh(__z) [8.1.5].
1750   //  Effects:  Behaves the same as C99 function cacosh, defined
1751   //            in subclause 7.3.6.1.
1752   template<typename _Tp>
1753     inline std::complex<_Tp>
1754     acosh(const std::complex<_Tp>& __z)
1755     { return __complex_acosh(__z); }
1756 #endif
1758   template<typename _Tp>
1759     std::complex<_Tp>
1760     __complex_asinh(const std::complex<_Tp>& __z)
1761     {
1762       std::complex<_Tp> __t((__z.real() - __z.imag())
1763                             * (__z.real() + __z.imag()) + _Tp(1.0),
1764                             _Tp(2.0) * __z.real() * __z.imag());
1765       __t = std::sqrt(__t);
1767       return std::log(__t + __z);
1768     }
1770 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1771   inline __complex__ float
1772   __complex_asinh(__complex__ float __z)
1773   { return __builtin_casinhf(__z); }
1775   inline __complex__ double
1776   __complex_asinh(__complex__ double __z)
1777   { return __builtin_casinh(__z); }
1779   inline __complex__ long double
1780   __complex_asinh(const __complex__ long double& __z)
1781   { return __builtin_casinhl(__z); }
1783   template<typename _Tp>
1784     inline std::complex<_Tp>
1785     asinh(const std::complex<_Tp>& __z)
1786     { return __complex_asinh(__z.__rep()); }
1787 #else
1788   /// asinh(__z) [8.1.6].
1789   //  Effects:  Behaves the same as C99 function casin, defined
1790   //            in subclause 7.3.6.2.
1791   template<typename _Tp>
1792     inline std::complex<_Tp>
1793     asinh(const std::complex<_Tp>& __z)
1794     { return __complex_asinh(__z); }
1795 #endif
1797   template<typename _Tp>
1798     std::complex<_Tp>
1799     __complex_atanh(const std::complex<_Tp>& __z)
1800     {
1801       const _Tp __i2 = __z.imag() * __z.imag();
1802       const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
1804       _Tp __num = _Tp(1.0) + __z.real();
1805       _Tp __den = _Tp(1.0) - __z.real();
1807       __num = __i2 + __num * __num;
1808       __den = __i2 + __den * __den;
1810       return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)),
1811                                _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
1812     }
1814 #if _GLIBCXX_USE_C99_COMPLEX_TR1
1815   inline __complex__ float
1816   __complex_atanh(__complex__ float __z)
1817   { return __builtin_catanhf(__z); }
1819   inline __complex__ double
1820   __complex_atanh(__complex__ double __z)
1821   { return __builtin_catanh(__z); }
1823   inline __complex__ long double
1824   __complex_atanh(const __complex__ long double& __z)
1825   { return __builtin_catanhl(__z); }
1827   template<typename _Tp>
1828     inline std::complex<_Tp>
1829     atanh(const std::complex<_Tp>& __z)
1830     { return __complex_atanh(__z.__rep()); }
1831 #else
1832   /// atanh(__z) [8.1.7].
1833   //  Effects:  Behaves the same as C99 function catanh, defined
1834   //            in subclause 7.3.6.3.
1835   template<typename _Tp>
1836     inline std::complex<_Tp>
1837     atanh(const std::complex<_Tp>& __z)
1838     { return __complex_atanh(__z); }
1839 #endif
1841   template<typename _Tp>
1842     inline _Tp
1843     /// fabs(__z) [8.1.8].
1844     //  Effects:  Behaves the same as C99 function cabs, defined
1845     //            in subclause 7.3.8.1.
1846     fabs(const std::complex<_Tp>& __z)
1847     { return std::abs(__z); }
1849   /// Additional overloads [8.1.9].
1850   template<typename _Tp>
1851     inline typename __gnu_cxx::__promote<_Tp>::__type
1852     arg(_Tp __x)
1853     {
1854       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1855 #if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC)
1856       return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L)
1857                                : __type();
1858 #else
1859       return std::arg(std::complex<__type>(__x));
1860 #endif
1861     }
1863   template<typename _Tp>
1864     _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
1865     imag(_Tp)
1866     { return _Tp(); }
1868   template<typename _Tp>
1869     _GLIBCXX20_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
1870     norm(_Tp __x)
1871     {
1872       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1873       return __type(__x) * __type(__x);
1874     }
1876   template<typename _Tp>
1877     _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
1878     real(_Tp __x)
1879     { return __x; }
1881   template<typename _Tp, typename _Up>
1882     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
1883     pow(const std::complex<_Tp>& __x, const _Up& __y)
1884     {
1885       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1886       return std::pow(std::complex<__type>(__x), __type(__y));
1887     }
1889   template<typename _Tp, typename _Up>
1890     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
1891     pow(const _Tp& __x, const std::complex<_Up>& __y)
1892     {
1893       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1894       return std::pow(__type(__x), std::complex<__type>(__y));
1895     }
1897   template<typename _Tp, typename _Up>
1898     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
1899     pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y)
1900     {
1901       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1902       return std::pow(std::complex<__type>(__x),
1903                       std::complex<__type>(__y));
1904     }
1906   // Forward declarations.
1907   // DR 781.
1908   template<typename _Tp>
1909     std::complex<_Tp> proj(const std::complex<_Tp>&);
1911   // Generic implementation of std::proj, does not work for infinities.
1912   template<typename _Tp>
1913     inline std::complex<_Tp>
1914     __complex_proj(const std::complex<_Tp>& __z)
1915     { return __z; }
1917 #if _GLIBCXX_USE_C99_COMPLEX
1918   inline complex<float>
1919   __complex_proj(const complex<float>& __z)
1920   { return __builtin_cprojf(__z.__rep()); }
1922   inline complex<double>
1923   __complex_proj(const complex<double>& __z)
1924   { return __builtin_cproj(__z.__rep()); }
1926   inline complex<long double>
1927   __complex_proj(const complex<long double>& __z)
1928   { return __builtin_cprojl(__z.__rep()); }
1929 #elif defined _GLIBCXX_USE_C99_MATH_TR1
1930   inline complex<float>
1931   __complex_proj(const complex<float>& __z)
1932   {
1933     if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
1934       return complex<float>(__builtin_inff(),
1935                             __builtin_copysignf(0.0f, __z.imag()));
1936     return __z;
1937   }
1939   inline complex<double>
1940   __complex_proj(const complex<double>& __z)
1941   {
1942     if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
1943       return complex<double>(__builtin_inf(),
1944                              __builtin_copysign(0.0, __z.imag()));
1945     return __z;
1946   }
1948   inline complex<long double>
1949   __complex_proj(const complex<long double>& __z)
1950   {
1951     if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
1952       return complex<long double>(__builtin_infl(),
1953                                   __builtin_copysignl(0.0l, __z.imag()));
1954     return __z;
1955   }
1956 #endif
1958   template<typename _Tp>
1959     inline std::complex<_Tp>
1960     proj(const std::complex<_Tp>& __z)
1961     { return __complex_proj(__z); }
1963   // Overload for scalars
1964   template<typename _Tp>
1965     inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
1966     proj(_Tp __x)
1967     {
1968       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1969       return std::proj(std::complex<__type>(__x));
1970     }
1972   template<typename _Tp>
1973     inline _GLIBCXX20_CONSTEXPR
1974         std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
1975     conj(_Tp __x)
1976     {
1977       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1978       return std::complex<__type>(__x, -__type());
1979     }
1981 #if __cplusplus > 201103L
1983 inline namespace literals {
1984 inline namespace complex_literals {
1985 #pragma GCC diagnostic push
1986 #pragma GCC diagnostic ignored "-Wliteral-suffix"
1987 #define __cpp_lib_complex_udls 201309
1989   constexpr std::complex<float>
1990   operator""if(long double __num)
1991   { return std::complex<float>{0.0F, static_cast<float>(__num)}; }
1993   constexpr std::complex<float>
1994   operator""if(unsigned long long __num)
1995   { return std::complex<float>{0.0F, static_cast<float>(__num)}; }
1997   constexpr std::complex<double>
1998   operator""i(long double __num)
1999   { return std::complex<double>{0.0, static_cast<double>(__num)}; }
2001   constexpr std::complex<double>
2002   operator""i(unsigned long long __num)
2003   { return std::complex<double>{0.0, static_cast<double>(__num)}; }
2005   constexpr std::complex<long double>
2006   operator""il(long double __num)
2007   { return std::complex<long double>{0.0L, __num}; }
2009   constexpr std::complex<long double>
2010   operator""il(unsigned long long __num)
2011   { return std::complex<long double>{0.0L, static_cast<long double>(__num)}; }
2013 #pragma GCC diagnostic pop
2014 } // inline namespace complex_literals
2015 } // inline namespace literals
2017 #endif // C++14
2019 _GLIBCXX_END_NAMESPACE_VERSION
2020 } // namespace
2022 #endif  // C++11
2024 #endif  /* _GLIBCXX_COMPLEX */