Home | History | Annotate | Line # | Download | only in std
      1   1.1       mrg // The template and inlines for the -*- C++ -*- complex number classes.
      2   1.1       mrg 
      3  1.15       mrg // Copyright (C) 1997-2024 Free Software Foundation, Inc.
      4   1.1       mrg //
      5   1.1       mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6   1.1       mrg // software; you can redistribute it and/or modify it under the
      7   1.1       mrg // terms of the GNU General Public License as published by the
      8   1.1       mrg // Free Software Foundation; either version 3, or (at your option)
      9   1.1       mrg // any later version.
     10   1.1       mrg 
     11   1.1       mrg // This library is distributed in the hope that it will be useful,
     12   1.1       mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13   1.1       mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14   1.1       mrg // GNU General Public License for more details.
     15   1.1       mrg 
     16   1.1       mrg // Under Section 7 of GPL version 3, you are granted additional
     17   1.1       mrg // permissions described in the GCC Runtime Library Exception, version
     18   1.1       mrg // 3.1, as published by the Free Software Foundation.
     19   1.1       mrg 
     20   1.1       mrg // You should have received a copy of the GNU General Public License and
     21   1.1       mrg // a copy of the GCC Runtime Library Exception along with this program;
     22   1.1       mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23   1.1       mrg // <http://www.gnu.org/licenses/>.
     24   1.1       mrg 
     25   1.1       mrg /** @file include/complex
     26   1.1       mrg  *  This is a Standard C++ Library header.
     27   1.1       mrg  */
     28   1.1       mrg 
     29   1.1       mrg //
     30   1.1       mrg // ISO C++ 14882: 26.2  Complex Numbers
     31   1.1       mrg // Note: this is not a conforming implementation.
     32   1.1       mrg // Initially implemented by Ulrich Drepper <drepper (a] cygnus.com>
     33   1.1       mrg // Improved by Gabriel Dos Reis <dosreis (a] cmla.ens-cachan.fr>
     34   1.1       mrg //
     35   1.1       mrg 
     36   1.1       mrg #ifndef _GLIBCXX_COMPLEX
     37   1.1       mrg #define _GLIBCXX_COMPLEX 1
     38   1.1       mrg 
     39   1.1       mrg #pragma GCC system_header
     40   1.1       mrg 
     41   1.1       mrg #include <bits/c++config.h>
     42   1.1       mrg #include <bits/cpp_type_traits.h>
     43   1.1       mrg #include <ext/type_traits.h>
     44   1.1       mrg #include <cmath>
     45   1.1       mrg #include <sstream>
     46   1.1       mrg 
     47   1.2  christos #if _GLIBCXX_USE_C99_COMPLEX
     48   1.3       wiz // This is disgusting; we can't include ccomplex because that requires c++11
     49   1.2  christos // and we can't use the builtins because those point to the wrong
     50   1.2  christos // ABI-wise cabs/cabsf so we manually declare those here and use
     51   1.2  christos // them directly.
     52   1.2  christos extern "C" float __c99_cabsf(_Complex float);
     53   1.2  christos extern "C" double __c99_cabs(_Complex double);
     54   1.2  christos extern "C" long double __c99_cabsl(_Complex long double);
     55   1.2  christos #endif
     56   1.2  christos 
     57   1.2  christos // Get rid of a macro possibly defined in <complex.h>
     58   1.2  christos #undef complex
     59   1.2  christos 
     60  1.15       mrg #ifdef __clang__
     61  1.15       mrg #pragma clang diagnostic push
     62  1.15       mrg #pragma clang diagnostic ignored "-Wc99-extensions"
     63  1.11       mrg #endif
     64  1.11       mrg 
     65  1.15       mrg #define __glibcxx_want_constexpr_complex
     66  1.15       mrg #define __glibcxx_want_complex_udls
     67  1.15       mrg #include <bits/version.h>
     68  1.15       mrg 
     69   1.2  christos namespace std _GLIBCXX_VISIBILITY(default)
     70   1.2  christos {
     71   1.2  christos _GLIBCXX_BEGIN_NAMESPACE_VERSION
     72   1.1       mrg 
     73   1.1       mrg   /**
     74   1.1       mrg    * @defgroup complex_numbers Complex Numbers
     75   1.1       mrg    * @ingroup numerics
     76   1.1       mrg    *
     77   1.1       mrg    * Classes and functions for complex numbers.
     78   1.1       mrg    * @{
     79   1.1       mrg    */
     80   1.1       mrg 
     81   1.1       mrg   // Forward declarations.
     82   1.1       mrg   template<typename _Tp> class complex;
     83   1.1       mrg   template<> class complex<float>;
     84   1.1       mrg   template<> class complex<double>;
     85   1.1       mrg   template<> class complex<long double>;
     86   1.1       mrg 
     87   1.1       mrg   ///  Return magnitude of @a z.
     88   1.1       mrg   template<typename _Tp> _Tp abs(const complex<_Tp>&);
     89   1.1       mrg   ///  Return phase angle of @a z.
     90   1.1       mrg   template<typename _Tp> _Tp arg(const complex<_Tp>&);
     91   1.1       mrg   ///  Return @a z magnitude squared.
     92  1.10       mrg   template<typename _Tp> _Tp _GLIBCXX20_CONSTEXPR norm(const complex<_Tp>&);
     93   1.1       mrg 
     94   1.1       mrg   ///  Return complex conjugate of @a z.
     95  1.10       mrg   template<typename _Tp>
     96  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp> conj(const complex<_Tp>&);
     97   1.1       mrg   ///  Return complex with magnitude @a rho and angle @a theta.
     98   1.1       mrg   template<typename _Tp> complex<_Tp> polar(const _Tp&, const _Tp& = 0);
     99   1.1       mrg 
    100   1.1       mrg   // Transcendentals:
    101   1.1       mrg   /// Return complex cosine of @a z.
    102   1.1       mrg   template<typename _Tp> complex<_Tp> cos(const complex<_Tp>&);
    103   1.1       mrg   /// Return complex hyperbolic cosine of @a z.
    104   1.1       mrg   template<typename _Tp> complex<_Tp> cosh(const complex<_Tp>&);
    105   1.1       mrg   /// Return complex base e exponential of @a z.
    106   1.1       mrg   template<typename _Tp> complex<_Tp> exp(const complex<_Tp>&);
    107   1.1       mrg   /// Return complex natural logarithm of @a z.
    108   1.1       mrg   template<typename _Tp> complex<_Tp> log(const complex<_Tp>&);
    109   1.1       mrg   /// Return complex base 10 logarithm of @a z.
    110   1.1       mrg   template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&);
    111   1.1       mrg   /// Return @a x to the @a y'th power.
    112   1.1       mrg   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int);
    113   1.1       mrg   /// Return @a x to the @a y'th power.
    114   1.1       mrg   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&);
    115   1.1       mrg   /// Return @a x to the @a y'th power.
    116   1.8       mrg   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&,
    117   1.1       mrg                                           const complex<_Tp>&);
    118   1.1       mrg   /// Return @a x to the @a y'th power.
    119   1.1       mrg   template<typename _Tp> complex<_Tp> pow(const _Tp&, const complex<_Tp>&);
    120   1.1       mrg   /// Return complex sine of @a z.
    121   1.1       mrg   template<typename _Tp> complex<_Tp> sin(const complex<_Tp>&);
    122   1.1       mrg   /// Return complex hyperbolic sine of @a z.
    123   1.1       mrg   template<typename _Tp> complex<_Tp> sinh(const complex<_Tp>&);
    124   1.1       mrg   /// Return complex square root of @a z.
    125   1.1       mrg   template<typename _Tp> complex<_Tp> sqrt(const complex<_Tp>&);
    126   1.1       mrg   /// Return complex tangent of @a z.
    127   1.1       mrg   template<typename _Tp> complex<_Tp> tan(const complex<_Tp>&);
    128   1.1       mrg   /// Return complex hyperbolic tangent of @a z.
    129   1.1       mrg   template<typename _Tp> complex<_Tp> tanh(const complex<_Tp>&);
    130   1.8       mrg 
    131   1.8       mrg 
    132   1.1       mrg   // 26.2.2  Primary template class complex
    133   1.1       mrg   /**
    134   1.1       mrg    *  Template to represent complex numbers.
    135   1.1       mrg    *
    136   1.1       mrg    *  Specializations for float, double, and long double are part of the
    137   1.1       mrg    *  library.  Results with any other type are not guaranteed.
    138   1.1       mrg    *
    139   1.1       mrg    *  @param  Tp  Type of real and imaginary values.
    140   1.1       mrg   */
    141   1.1       mrg   template<typename _Tp>
    142  1.13       mrg     class complex
    143   1.1       mrg     {
    144  1.13       mrg     public:
    145   1.1       mrg       /// Value typedef.
    146   1.1       mrg       typedef _Tp value_type;
    147   1.8       mrg 
    148   1.1       mrg       ///  Default constructor.  First parameter is x, second parameter is y.
    149   1.1       mrg       ///  Unspecified parameters default to 0.
    150   1.2  christos       _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
    151   1.1       mrg       : _M_real(__r), _M_imag(__i) { }
    152   1.1       mrg 
    153   1.4       mrg       // Let the compiler synthesize the copy constructor
    154   1.4       mrg #if __cplusplus >= 201103L
    155   1.4       mrg       constexpr complex(const complex&) = default;
    156   1.4       mrg #endif
    157   1.4       mrg 
    158   1.4       mrg       ///  Converting constructor.
    159   1.1       mrg       template<typename _Up>
    160  1.15       mrg #if __cplusplus > 202002L
    161  1.15       mrg 	explicit(!requires(_Up __u) { _Tp{__u}; })
    162  1.15       mrg #endif
    163  1.15       mrg 	_GLIBCXX_CONSTEXPR complex(const complex<_Up>& __z)
    164  1.15       mrg 	: _M_real(_Tp(__z.real())), _M_imag(_Tp(__z.imag())) { }
    165   1.1       mrg 
    166   1.2  christos #if __cplusplus >= 201103L
    167   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    168   1.1       mrg       // DR 387. std::complex over-encapsulated.
    169   1.2  christos       _GLIBCXX_ABI_TAG_CXX11
    170   1.8       mrg       constexpr _Tp
    171   1.4       mrg       real() const { return _M_real; }
    172   1.2  christos 
    173   1.2  christos       _GLIBCXX_ABI_TAG_CXX11
    174   1.8       mrg       constexpr _Tp
    175   1.4       mrg       imag() const { return _M_imag; }
    176   1.1       mrg #else
    177   1.1       mrg       ///  Return real part of complex number.
    178   1.8       mrg       _Tp&
    179   1.2  christos       real() { return _M_real; }
    180   1.1       mrg 
    181   1.1       mrg       ///  Return real part of complex number.
    182   1.8       mrg       const _Tp&
    183   1.2  christos       real() const { return _M_real; }
    184   1.1       mrg 
    185   1.1       mrg       ///  Return imaginary part of complex number.
    186   1.8       mrg       _Tp&
    187   1.2  christos       imag() { return _M_imag; }
    188   1.1       mrg 
    189   1.1       mrg       ///  Return imaginary part of complex number.
    190   1.8       mrg       const _Tp&
    191   1.2  christos       imag() const { return _M_imag; }
    192   1.1       mrg #endif
    193   1.1       mrg 
    194   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    195   1.1       mrg       // DR 387. std::complex over-encapsulated.
    196  1.10       mrg       _GLIBCXX20_CONSTEXPR void
    197   1.2  christos       real(_Tp __val) { _M_real = __val; }
    198   1.1       mrg 
    199  1.10       mrg       _GLIBCXX20_CONSTEXPR void
    200   1.2  christos       imag(_Tp __val) { _M_imag = __val; }
    201   1.1       mrg 
    202   1.4       mrg       /// Assign a scalar to this complex number.
    203  1.10       mrg       _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const _Tp&);
    204   1.8       mrg 
    205   1.4       mrg       /// Add a scalar to this complex number.
    206   1.1       mrg       // 26.2.5/1
    207  1.10       mrg       _GLIBCXX20_CONSTEXPR complex<_Tp>&
    208   1.1       mrg       operator+=(const _Tp& __t)
    209   1.1       mrg       {
    210   1.1       mrg 	_M_real += __t;
    211   1.1       mrg 	return *this;
    212   1.1       mrg       }
    213   1.1       mrg 
    214   1.4       mrg       /// Subtract a scalar from this complex number.
    215   1.1       mrg       // 26.2.5/3
    216  1.10       mrg       _GLIBCXX20_CONSTEXPR complex<_Tp>&
    217   1.1       mrg       operator-=(const _Tp& __t)
    218   1.1       mrg       {
    219   1.1       mrg 	_M_real -= __t;
    220   1.1       mrg 	return *this;
    221   1.1       mrg       }
    222   1.1       mrg 
    223   1.4       mrg       /// Multiply this complex number by a scalar.
    224  1.10       mrg       _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const _Tp&);
    225   1.4       mrg       /// Divide this complex number by a scalar.
    226  1.10       mrg       _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const _Tp&);
    227   1.1       mrg 
    228   1.4       mrg       // Let the compiler synthesize the copy assignment operator
    229   1.4       mrg #if __cplusplus >= 201103L
    230  1.10       mrg       _GLIBCXX20_CONSTEXPR complex& operator=(const complex&) = default;
    231   1.4       mrg #endif
    232   1.4       mrg 
    233   1.4       mrg       /// Assign another complex number to this one.
    234   1.1       mrg       template<typename _Up>
    235  1.10       mrg         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const complex<_Up>&);
    236   1.4       mrg       /// Add another complex number to this one.
    237   1.1       mrg       template<typename _Up>
    238  1.10       mrg         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator+=(const complex<_Up>&);
    239   1.4       mrg       /// Subtract another complex number from this one.
    240   1.1       mrg       template<typename _Up>
    241  1.10       mrg         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator-=(const complex<_Up>&);
    242   1.4       mrg       /// Multiply this complex number by another.
    243   1.1       mrg       template<typename _Up>
    244  1.10       mrg         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const complex<_Up>&);
    245   1.4       mrg       /// Divide this complex number by another.
    246   1.1       mrg       template<typename _Up>
    247  1.10       mrg         _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const complex<_Up>&);
    248   1.1       mrg 
    249   1.4       mrg       _GLIBCXX_CONSTEXPR complex __rep() const
    250   1.1       mrg       { return *this; }
    251   1.1       mrg 
    252   1.1       mrg     private:
    253   1.1       mrg       _Tp _M_real;
    254   1.1       mrg       _Tp _M_imag;
    255   1.1       mrg     };
    256   1.1       mrg 
    257   1.1       mrg   template<typename _Tp>
    258  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    259   1.1       mrg     complex<_Tp>::operator=(const _Tp& __t)
    260   1.1       mrg     {
    261   1.1       mrg      _M_real = __t;
    262   1.1       mrg      _M_imag = _Tp();
    263   1.1       mrg      return *this;
    264   1.8       mrg     }
    265   1.1       mrg 
    266   1.1       mrg   // 26.2.5/5
    267   1.1       mrg   template<typename _Tp>
    268  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    269   1.1       mrg     complex<_Tp>::operator*=(const _Tp& __t)
    270   1.1       mrg     {
    271   1.1       mrg       _M_real *= __t;
    272   1.1       mrg       _M_imag *= __t;
    273   1.1       mrg       return *this;
    274   1.1       mrg     }
    275   1.1       mrg 
    276   1.1       mrg   // 26.2.5/7
    277   1.1       mrg   template<typename _Tp>
    278  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    279   1.1       mrg     complex<_Tp>::operator/=(const _Tp& __t)
    280   1.1       mrg     {
    281   1.1       mrg       _M_real /= __t;
    282   1.1       mrg       _M_imag /= __t;
    283   1.1       mrg       return *this;
    284   1.1       mrg     }
    285   1.1       mrg 
    286   1.1       mrg   template<typename _Tp>
    287   1.1       mrg     template<typename _Up>
    288  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    289   1.1       mrg     complex<_Tp>::operator=(const complex<_Up>& __z)
    290   1.1       mrg     {
    291   1.1       mrg       _M_real = __z.real();
    292   1.1       mrg       _M_imag = __z.imag();
    293   1.1       mrg       return *this;
    294   1.1       mrg     }
    295   1.1       mrg 
    296   1.1       mrg   // 26.2.5/9
    297   1.1       mrg   template<typename _Tp>
    298   1.1       mrg     template<typename _Up>
    299  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    300   1.1       mrg     complex<_Tp>::operator+=(const complex<_Up>& __z)
    301   1.1       mrg     {
    302   1.1       mrg       _M_real += __z.real();
    303   1.1       mrg       _M_imag += __z.imag();
    304   1.1       mrg       return *this;
    305   1.1       mrg     }
    306   1.1       mrg 
    307   1.1       mrg   // 26.2.5/11
    308   1.1       mrg   template<typename _Tp>
    309   1.1       mrg     template<typename _Up>
    310  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    311   1.1       mrg     complex<_Tp>::operator-=(const complex<_Up>& __z)
    312   1.1       mrg     {
    313   1.1       mrg       _M_real -= __z.real();
    314   1.1       mrg       _M_imag -= __z.imag();
    315   1.1       mrg       return *this;
    316   1.1       mrg     }
    317   1.1       mrg 
    318   1.1       mrg   // 26.2.5/13
    319   1.1       mrg   // XXX: This is a grammar school implementation.
    320   1.1       mrg   template<typename _Tp>
    321   1.1       mrg     template<typename _Up>
    322  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    323   1.1       mrg     complex<_Tp>::operator*=(const complex<_Up>& __z)
    324   1.1       mrg     {
    325   1.1       mrg       const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag();
    326   1.1       mrg       _M_imag = _M_real * __z.imag() + _M_imag * __z.real();
    327   1.1       mrg       _M_real = __r;
    328   1.1       mrg       return *this;
    329   1.1       mrg     }
    330   1.1       mrg 
    331   1.1       mrg   // 26.2.5/15
    332   1.1       mrg   // XXX: This is a grammar school implementation.
    333   1.1       mrg   template<typename _Tp>
    334   1.1       mrg     template<typename _Up>
    335  1.10       mrg     _GLIBCXX20_CONSTEXPR complex<_Tp>&
    336   1.1       mrg     complex<_Tp>::operator/=(const complex<_Up>& __z)
    337   1.1       mrg     {
    338   1.1       mrg       const _Tp __r =  _M_real * __z.real() + _M_imag * __z.imag();
    339   1.1       mrg       const _Tp __n = std::norm(__z);
    340   1.1       mrg       _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n;
    341   1.1       mrg       _M_real = __r / __n;
    342   1.1       mrg       return *this;
    343   1.1       mrg     }
    344   1.8       mrg 
    345   1.1       mrg   // Operators:
    346  1.12       mrg   ///@{
    347   1.1       mrg   ///  Return new complex value @a x plus @a y.
    348   1.1       mrg   template<typename _Tp>
    349  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    350   1.1       mrg     operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
    351   1.1       mrg     {
    352   1.1       mrg       complex<_Tp> __r = __x;
    353   1.1       mrg       __r += __y;
    354   1.1       mrg       return __r;
    355   1.1       mrg     }
    356   1.1       mrg 
    357   1.1       mrg   template<typename _Tp>
    358  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    359   1.1       mrg     operator+(const complex<_Tp>& __x, const _Tp& __y)
    360   1.1       mrg     {
    361   1.1       mrg       complex<_Tp> __r = __x;
    362   1.1       mrg       __r += __y;
    363   1.1       mrg       return __r;
    364   1.1       mrg     }
    365   1.1       mrg 
    366   1.1       mrg   template<typename _Tp>
    367  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    368   1.1       mrg     operator+(const _Tp& __x, const complex<_Tp>& __y)
    369   1.1       mrg     {
    370   1.1       mrg       complex<_Tp> __r = __y;
    371   1.1       mrg       __r += __x;
    372   1.1       mrg       return __r;
    373   1.1       mrg     }
    374  1.12       mrg   ///@}
    375   1.1       mrg 
    376  1.12       mrg   ///@{
    377   1.1       mrg   ///  Return new complex value @a x minus @a y.
    378   1.1       mrg   template<typename _Tp>
    379  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    380   1.1       mrg     operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
    381   1.1       mrg     {
    382   1.1       mrg       complex<_Tp> __r = __x;
    383   1.1       mrg       __r -= __y;
    384   1.1       mrg       return __r;
    385   1.1       mrg     }
    386   1.8       mrg 
    387   1.1       mrg   template<typename _Tp>
    388  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    389   1.1       mrg     operator-(const complex<_Tp>& __x, const _Tp& __y)
    390   1.1       mrg     {
    391   1.1       mrg       complex<_Tp> __r = __x;
    392   1.1       mrg       __r -= __y;
    393   1.1       mrg       return __r;
    394   1.1       mrg     }
    395   1.1       mrg 
    396   1.1       mrg   template<typename _Tp>
    397  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    398   1.1       mrg     operator-(const _Tp& __x, const complex<_Tp>& __y)
    399   1.1       mrg     {
    400  1.10       mrg       complex<_Tp> __r = -__y;
    401  1.10       mrg       __r += __x;
    402   1.1       mrg       return __r;
    403   1.1       mrg     }
    404  1.12       mrg   ///@}
    405   1.1       mrg 
    406  1.12       mrg   ///@{
    407   1.1       mrg   ///  Return new complex value @a x times @a y.
    408   1.1       mrg   template<typename _Tp>
    409  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    410   1.1       mrg     operator*(const complex<_Tp>& __x, const complex<_Tp>& __y)
    411   1.1       mrg     {
    412   1.1       mrg       complex<_Tp> __r = __x;
    413   1.1       mrg       __r *= __y;
    414   1.1       mrg       return __r;
    415   1.1       mrg     }
    416   1.1       mrg 
    417   1.1       mrg   template<typename _Tp>
    418  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    419   1.1       mrg     operator*(const complex<_Tp>& __x, const _Tp& __y)
    420   1.1       mrg     {
    421   1.1       mrg       complex<_Tp> __r = __x;
    422   1.1       mrg       __r *= __y;
    423   1.1       mrg       return __r;
    424   1.1       mrg     }
    425   1.1       mrg 
    426   1.1       mrg   template<typename _Tp>
    427  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    428   1.1       mrg     operator*(const _Tp& __x, const complex<_Tp>& __y)
    429   1.1       mrg     {
    430   1.1       mrg       complex<_Tp> __r = __y;
    431   1.1       mrg       __r *= __x;
    432   1.1       mrg       return __r;
    433   1.1       mrg     }
    434  1.12       mrg   ///@}
    435   1.1       mrg 
    436  1.12       mrg   ///@{
    437   1.1       mrg   ///  Return new complex value @a x divided by @a y.
    438   1.1       mrg   template<typename _Tp>
    439  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    440   1.1       mrg     operator/(const complex<_Tp>& __x, const complex<_Tp>& __y)
    441   1.1       mrg     {
    442   1.1       mrg       complex<_Tp> __r = __x;
    443   1.1       mrg       __r /= __y;
    444   1.1       mrg       return __r;
    445   1.1       mrg     }
    446   1.8       mrg 
    447   1.1       mrg   template<typename _Tp>
    448  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    449   1.1       mrg     operator/(const complex<_Tp>& __x, const _Tp& __y)
    450   1.1       mrg     {
    451   1.1       mrg       complex<_Tp> __r = __x;
    452   1.1       mrg       __r /= __y;
    453   1.1       mrg       return __r;
    454   1.1       mrg     }
    455   1.1       mrg 
    456   1.1       mrg   template<typename _Tp>
    457  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    458   1.1       mrg     operator/(const _Tp& __x, const complex<_Tp>& __y)
    459   1.1       mrg     {
    460   1.1       mrg       complex<_Tp> __r = __x;
    461   1.1       mrg       __r /= __y;
    462   1.1       mrg       return __r;
    463   1.1       mrg     }
    464  1.12       mrg   ///@}
    465   1.1       mrg 
    466   1.1       mrg   ///  Return @a x.
    467   1.1       mrg   template<typename _Tp>
    468  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    469   1.1       mrg     operator+(const complex<_Tp>& __x)
    470   1.1       mrg     { return __x; }
    471   1.1       mrg 
    472   1.1       mrg   ///  Return complex negation of @a x.
    473   1.1       mrg   template<typename _Tp>
    474  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    475   1.1       mrg     operator-(const complex<_Tp>& __x)
    476  1.10       mrg     { return complex<_Tp>(-__x.real(), -__x.imag()); }
    477   1.1       mrg 
    478  1.12       mrg   ///@{
    479   1.1       mrg   ///  Return true if @a x is equal to @a y.
    480   1.1       mrg   template<typename _Tp>
    481   1.2  christos     inline _GLIBCXX_CONSTEXPR bool
    482   1.1       mrg     operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
    483   1.1       mrg     { return __x.real() == __y.real() && __x.imag() == __y.imag(); }
    484   1.1       mrg 
    485   1.1       mrg   template<typename _Tp>
    486   1.2  christos     inline _GLIBCXX_CONSTEXPR bool
    487   1.1       mrg     operator==(const complex<_Tp>& __x, const _Tp& __y)
    488   1.1       mrg     { return __x.real() == __y && __x.imag() == _Tp(); }
    489   1.1       mrg 
    490  1.11       mrg #if !(__cpp_impl_three_way_comparison >= 201907L)
    491   1.1       mrg   template<typename _Tp>
    492   1.2  christos     inline _GLIBCXX_CONSTEXPR bool
    493   1.1       mrg     operator==(const _Tp& __x, const complex<_Tp>& __y)
    494   1.1       mrg     { return __x == __y.real() && _Tp() == __y.imag(); }
    495  1.12       mrg   ///@}
    496   1.1       mrg 
    497  1.12       mrg   ///@{
    498   1.1       mrg   ///  Return false if @a x is equal to @a y.
    499   1.1       mrg   template<typename _Tp>
    500   1.2  christos     inline _GLIBCXX_CONSTEXPR bool
    501   1.1       mrg     operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
    502   1.1       mrg     { return __x.real() != __y.real() || __x.imag() != __y.imag(); }
    503   1.1       mrg 
    504   1.1       mrg   template<typename _Tp>
    505   1.2  christos     inline _GLIBCXX_CONSTEXPR bool
    506   1.1       mrg     operator!=(const complex<_Tp>& __x, const _Tp& __y)
    507   1.1       mrg     { return __x.real() != __y || __x.imag() != _Tp(); }
    508   1.1       mrg 
    509   1.1       mrg   template<typename _Tp>
    510   1.2  christos     inline _GLIBCXX_CONSTEXPR bool
    511   1.1       mrg     operator!=(const _Tp& __x, const complex<_Tp>& __y)
    512   1.1       mrg     { return __x != __y.real() || _Tp() != __y.imag(); }
    513  1.11       mrg #endif
    514  1.12       mrg   ///@}
    515   1.1       mrg 
    516   1.1       mrg   ///  Extraction operator for complex values.
    517   1.1       mrg   template<typename _Tp, typename _CharT, class _Traits>
    518   1.1       mrg     basic_istream<_CharT, _Traits>&
    519   1.1       mrg     operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
    520   1.1       mrg     {
    521   1.9       mrg       bool __fail = true;
    522   1.9       mrg       _CharT __ch;
    523   1.9       mrg       if (__is >> __ch)
    524   1.1       mrg 	{
    525   1.9       mrg 	  if (_Traits::eq(__ch, __is.widen('(')))
    526   1.1       mrg 	    {
    527   1.9       mrg 	      _Tp __u;
    528   1.9       mrg 	      if (__is >> __u >> __ch)
    529   1.9       mrg 		{
    530   1.9       mrg 		  const _CharT __rparen = __is.widen(')');
    531   1.9       mrg 		  if (_Traits::eq(__ch, __rparen))
    532   1.9       mrg 		    {
    533   1.9       mrg 		      __x = __u;
    534   1.9       mrg 		      __fail = false;
    535   1.9       mrg 		    }
    536   1.9       mrg 		  else if (_Traits::eq(__ch, __is.widen(',')))
    537   1.9       mrg 		    {
    538   1.9       mrg 		      _Tp __v;
    539   1.9       mrg 		      if (__is >> __v >> __ch)
    540   1.9       mrg 			{
    541   1.9       mrg 			  if (_Traits::eq(__ch, __rparen))
    542   1.9       mrg 			    {
    543   1.9       mrg 			      __x = complex<_Tp>(__u, __v);
    544   1.9       mrg 			      __fail = false;
    545   1.9       mrg 			    }
    546   1.9       mrg 			  else
    547   1.9       mrg 			    __is.putback(__ch);
    548   1.9       mrg 			}
    549   1.9       mrg 		    }
    550   1.9       mrg 		  else
    551   1.9       mrg 		    __is.putback(__ch);
    552   1.9       mrg 		}
    553   1.1       mrg 	    }
    554   1.1       mrg 	  else
    555   1.9       mrg 	    {
    556   1.9       mrg 	      __is.putback(__ch);
    557   1.9       mrg 	      _Tp __u;
    558   1.9       mrg 	      if (__is >> __u)
    559   1.9       mrg 		{
    560   1.9       mrg 		  __x = __u;
    561   1.9       mrg 		  __fail = false;
    562   1.9       mrg 		}
    563   1.9       mrg 	    }
    564   1.1       mrg 	}
    565   1.9       mrg       if (__fail)
    566   1.9       mrg 	__is.setstate(ios_base::failbit);
    567   1.1       mrg       return __is;
    568   1.1       mrg     }
    569   1.1       mrg 
    570   1.1       mrg   ///  Insertion operator for complex values.
    571   1.1       mrg   template<typename _Tp, typename _CharT, class _Traits>
    572   1.1       mrg     basic_ostream<_CharT, _Traits>&
    573   1.1       mrg     operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
    574   1.1       mrg     {
    575   1.1       mrg       basic_ostringstream<_CharT, _Traits> __s;
    576   1.1       mrg       __s.flags(__os.flags());
    577   1.1       mrg       __s.imbue(__os.getloc());
    578   1.1       mrg       __s.precision(__os.precision());
    579   1.1       mrg       __s << '(' << __x.real() << ',' << __x.imag() << ')';
    580   1.1       mrg       return __os << __s.str();
    581   1.1       mrg     }
    582   1.1       mrg 
    583   1.1       mrg   // Values
    584   1.2  christos #if __cplusplus >= 201103L
    585   1.1       mrg   template<typename _Tp>
    586   1.2  christos     constexpr _Tp
    587   1.1       mrg     real(const complex<_Tp>& __z)
    588   1.1       mrg     { return __z.real(); }
    589   1.2  christos 
    590   1.1       mrg   template<typename _Tp>
    591   1.2  christos     constexpr _Tp
    592   1.1       mrg     imag(const complex<_Tp>& __z)
    593   1.1       mrg     { return __z.imag(); }
    594   1.1       mrg #else
    595   1.1       mrg   template<typename _Tp>
    596   1.1       mrg     inline _Tp&
    597   1.1       mrg     real(complex<_Tp>& __z)
    598   1.1       mrg     { return __z.real(); }
    599   1.8       mrg 
    600   1.1       mrg   template<typename _Tp>
    601   1.1       mrg     inline const _Tp&
    602   1.1       mrg     real(const complex<_Tp>& __z)
    603   1.1       mrg     { return __z.real(); }
    604   1.8       mrg 
    605   1.1       mrg   template<typename _Tp>
    606   1.1       mrg     inline _Tp&
    607   1.1       mrg     imag(complex<_Tp>& __z)
    608   1.1       mrg     { return __z.imag(); }
    609   1.8       mrg 
    610   1.1       mrg   template<typename _Tp>
    611   1.1       mrg     inline const _Tp&
    612   1.1       mrg     imag(const complex<_Tp>& __z)
    613   1.1       mrg     { return __z.imag(); }
    614   1.1       mrg #endif
    615   1.1       mrg 
    616  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX
    617  1.15       mrg #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
    618  1.15       mrg   inline _Float16
    619  1.15       mrg   __complex_abs(__complex__ _Float16 __z)
    620  1.15       mrg   { return _Float16(__builtin_cabsf(__z)); }
    621  1.15       mrg 
    622  1.15       mrg   inline _Float16
    623  1.15       mrg   __complex_arg(__complex__ _Float16 __z)
    624  1.15       mrg   { return _Float16(__builtin_cargf(__z)); }
    625  1.15       mrg 
    626  1.15       mrg   inline __complex__ _Float16
    627  1.15       mrg   __complex_cos(__complex__ _Float16 __z)
    628  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_ccosf(__z)); }
    629  1.15       mrg 
    630  1.15       mrg   inline __complex__ _Float16
    631  1.15       mrg   __complex_cosh(__complex__ _Float16 __z)
    632  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_ccoshf(__z)); }
    633  1.15       mrg 
    634  1.15       mrg   inline __complex__ _Float16
    635  1.15       mrg   __complex_exp(__complex__ _Float16 __z)
    636  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_cexpf(__z)); }
    637  1.15       mrg 
    638  1.15       mrg   inline __complex__ _Float16
    639  1.15       mrg   __complex_log(__complex__ _Float16 __z)
    640  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_clogf(__z)); }
    641  1.15       mrg 
    642  1.15       mrg   inline __complex__ _Float16
    643  1.15       mrg   __complex_sin(__complex__ _Float16 __z)
    644  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_csinf(__z)); }
    645  1.15       mrg 
    646  1.15       mrg   inline __complex__ _Float16
    647  1.15       mrg   __complex_sinh(__complex__ _Float16 __z)
    648  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_csinhf(__z)); }
    649  1.15       mrg 
    650  1.15       mrg   inline __complex__ _Float16
    651  1.15       mrg   __complex_sqrt(__complex__ _Float16 __z)
    652  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_csqrtf(__z)); }
    653  1.15       mrg 
    654  1.15       mrg   inline __complex__ _Float16
    655  1.15       mrg   __complex_tan(__complex__ _Float16 __z)
    656  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_ctanf(__z)); }
    657  1.15       mrg 
    658  1.15       mrg   inline __complex__ _Float16
    659  1.15       mrg   __complex_tanh(__complex__ _Float16 __z)
    660  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_ctanhf(__z)); }
    661  1.15       mrg 
    662  1.15       mrg   inline __complex__ _Float16
    663  1.15       mrg   __complex_pow(__complex__ _Float16 __x, __complex__ _Float16 __y)
    664  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_cpowf(__x, __y)); }
    665  1.15       mrg #endif
    666  1.15       mrg 
    667  1.15       mrg #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
    668  1.15       mrg   inline _Float32
    669  1.15       mrg   __complex_abs(__complex__ _Float32 __z) { return __builtin_cabsf(__z); }
    670  1.15       mrg 
    671  1.15       mrg   inline _Float32
    672  1.15       mrg   __complex_arg(__complex__ _Float32 __z) { return __builtin_cargf(__z); }
    673  1.15       mrg 
    674  1.15       mrg   inline __complex__ _Float32
    675  1.15       mrg   __complex_cos(__complex__ _Float32 __z) { return __builtin_ccosf(__z); }
    676  1.15       mrg 
    677  1.15       mrg   inline __complex__ _Float32
    678  1.15       mrg   __complex_cosh(__complex__ _Float32 __z) { return __builtin_ccoshf(__z); }
    679  1.15       mrg 
    680  1.15       mrg   inline __complex__ _Float32
    681  1.15       mrg   __complex_exp(__complex__ _Float32 __z) { return __builtin_cexpf(__z); }
    682  1.15       mrg 
    683  1.15       mrg   inline __complex__ _Float32
    684  1.15       mrg   __complex_log(__complex__ _Float32 __z) { return __builtin_clogf(__z); }
    685  1.15       mrg 
    686  1.15       mrg   inline __complex__ _Float32
    687  1.15       mrg   __complex_sin(__complex__ _Float32 __z) { return __builtin_csinf(__z); }
    688  1.15       mrg 
    689  1.15       mrg   inline __complex__ _Float32
    690  1.15       mrg   __complex_sinh(__complex__ _Float32 __z) { return __builtin_csinhf(__z); }
    691  1.15       mrg 
    692  1.15       mrg   inline __complex__ _Float32
    693  1.15       mrg   __complex_sqrt(__complex__ _Float32 __z) { return __builtin_csqrtf(__z); }
    694  1.15       mrg 
    695  1.15       mrg   inline __complex__ _Float32
    696  1.15       mrg   __complex_tan(__complex__ _Float32 __z) { return __builtin_ctanf(__z); }
    697  1.15       mrg 
    698  1.15       mrg   inline __complex__ _Float32
    699  1.15       mrg   __complex_tanh(__complex__ _Float32 __z) { return __builtin_ctanhf(__z); }
    700  1.15       mrg 
    701  1.15       mrg   inline __complex__ _Float32
    702  1.15       mrg   __complex_pow(__complex__ _Float32 __x, __complex__ _Float32 __y)
    703  1.15       mrg   { return __builtin_cpowf(__x, __y); }
    704  1.15       mrg #endif
    705  1.15       mrg 
    706  1.15       mrg #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
    707  1.15       mrg   inline _Float64
    708  1.15       mrg   __complex_abs(__complex__ _Float64 __z) { return __builtin_cabs(__z); }
    709  1.15       mrg 
    710  1.15       mrg   inline _Float64
    711  1.15       mrg   __complex_arg(__complex__ _Float64 __z) { return __builtin_carg(__z); }
    712  1.15       mrg 
    713  1.15       mrg   inline __complex__ _Float64
    714  1.15       mrg   __complex_cos(__complex__ _Float64 __z) { return __builtin_ccos(__z); }
    715  1.15       mrg 
    716  1.15       mrg   inline __complex__ _Float64
    717  1.15       mrg   __complex_cosh(__complex__ _Float64 __z) { return __builtin_ccosh(__z); }
    718  1.15       mrg 
    719  1.15       mrg   inline __complex__ _Float64
    720  1.15       mrg   __complex_exp(__complex__ _Float64 __z) { return __builtin_cexp(__z); }
    721  1.15       mrg 
    722  1.15       mrg   inline __complex__ _Float64
    723  1.15       mrg   __complex_log(__complex__ _Float64 __z) { return __builtin_clog(__z); }
    724  1.15       mrg 
    725  1.15       mrg   inline __complex__ _Float64
    726  1.15       mrg   __complex_sin(__complex__ _Float64 __z) { return __builtin_csin(__z); }
    727  1.15       mrg 
    728  1.15       mrg   inline __complex__ _Float64
    729  1.15       mrg   __complex_sinh(__complex__ _Float64 __z) { return __builtin_csinh(__z); }
    730  1.15       mrg 
    731  1.15       mrg   inline __complex__ _Float64
    732  1.15       mrg   __complex_sqrt(__complex__ _Float64 __z) { return __builtin_csqrt(__z); }
    733  1.15       mrg 
    734  1.15       mrg   inline __complex__ _Float64
    735  1.15       mrg   __complex_tan(__complex__ _Float64 __z) { return __builtin_ctan(__z); }
    736  1.15       mrg 
    737  1.15       mrg   inline __complex__ _Float64
    738  1.15       mrg   __complex_tanh(__complex__ _Float64 __z) { return __builtin_ctanh(__z); }
    739  1.15       mrg 
    740  1.15       mrg   inline __complex__ _Float64
    741  1.15       mrg   __complex_pow(__complex__ _Float64 __x, __complex__ _Float64 __y)
    742  1.15       mrg   { return __builtin_cpow(__x, __y); }
    743  1.15       mrg #endif
    744  1.15       mrg 
    745  1.15       mrg #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
    746  1.15       mrg   inline _Float128
    747  1.15       mrg   __complex_abs(__complex__ _Float128 __z) { return __builtin_cabsl(__z); }
    748  1.15       mrg 
    749  1.15       mrg   inline _Float128
    750  1.15       mrg   __complex_arg(__complex__ _Float128 __z) { return __builtin_cargl(__z); }
    751  1.15       mrg 
    752  1.15       mrg   inline __complex__ _Float128
    753  1.15       mrg   __complex_cos(__complex__ _Float128 __z) { return __builtin_ccosl(__z); }
    754  1.15       mrg 
    755  1.15       mrg   inline __complex__ _Float128
    756  1.15       mrg   __complex_cosh(__complex__ _Float128 __z) { return __builtin_ccoshl(__z); }
    757  1.15       mrg 
    758  1.15       mrg   inline __complex__ _Float128
    759  1.15       mrg   __complex_exp(__complex__ _Float128 __z) { return __builtin_cexpl(__z); }
    760  1.15       mrg 
    761  1.15       mrg   inline __complex__ _Float128
    762  1.15       mrg   __complex_log(__complex__ _Float128 __z) { return __builtin_clogl(__z); }
    763  1.15       mrg 
    764  1.15       mrg   inline __complex__ _Float128
    765  1.15       mrg   __complex_sin(__complex__ _Float128 __z) { return __builtin_csinl(__z); }
    766  1.15       mrg 
    767  1.15       mrg   inline __complex__ _Float128
    768  1.15       mrg   __complex_sinh(__complex__ _Float128 __z) { return __builtin_csinhl(__z); }
    769  1.15       mrg 
    770  1.15       mrg   inline __complex__ _Float128
    771  1.15       mrg   __complex_sqrt(__complex__ _Float128 __z) { return __builtin_csqrtl(__z); }
    772  1.15       mrg 
    773  1.15       mrg   inline __complex__ _Float128
    774  1.15       mrg   __complex_tan(__complex__ _Float128 __z) { return __builtin_ctanl(__z); }
    775  1.15       mrg 
    776  1.15       mrg   inline __complex__ _Float128
    777  1.15       mrg   __complex_tanh(__complex__ _Float128 __z) { return __builtin_ctanhl(__z); }
    778  1.15       mrg 
    779  1.15       mrg   inline __complex__ _Float128
    780  1.15       mrg   __complex_pow(__complex__ _Float128 __x, __complex__ _Float128 __y)
    781  1.15       mrg   { return __builtin_cpowl(__x, __y); }
    782  1.15       mrg #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
    783  1.15       mrg   inline _Float128
    784  1.15       mrg   __complex_abs(__complex__ _Float128 __z) { return __builtin_cabsf128(__z); }
    785  1.15       mrg 
    786  1.15       mrg   inline _Float128
    787  1.15       mrg   __complex_arg(__complex__ _Float128 __z) { return __builtin_cargf128(__z); }
    788  1.15       mrg 
    789  1.15       mrg   inline __complex__ _Float128
    790  1.15       mrg   __complex_cos(__complex__ _Float128 __z) { return __builtin_ccosf128(__z); }
    791  1.15       mrg 
    792  1.15       mrg   inline __complex__ _Float128
    793  1.15       mrg   __complex_cosh(__complex__ _Float128 __z) { return __builtin_ccoshf128(__z); }
    794  1.15       mrg 
    795  1.15       mrg   inline __complex__ _Float128
    796  1.15       mrg   __complex_exp(__complex__ _Float128 __z) { return __builtin_cexpf128(__z); }
    797  1.15       mrg 
    798  1.15       mrg   inline __complex__ _Float128
    799  1.15       mrg   __complex_log(__complex__ _Float128 __z) { return __builtin_clogf128(__z); }
    800  1.15       mrg 
    801  1.15       mrg   inline __complex__ _Float128
    802  1.15       mrg   __complex_sin(__complex__ _Float128 __z) { return __builtin_csinf128(__z); }
    803  1.15       mrg 
    804  1.15       mrg   inline __complex__ _Float128
    805  1.15       mrg   __complex_sinh(__complex__ _Float128 __z) { return __builtin_csinhf128(__z); }
    806  1.15       mrg 
    807  1.15       mrg   inline __complex__ _Float128
    808  1.15       mrg   __complex_sqrt(__complex__ _Float128 __z) { return __builtin_csqrtf128(__z); }
    809  1.15       mrg 
    810  1.15       mrg   inline __complex__ _Float128
    811  1.15       mrg   __complex_tan(__complex__ _Float128 __z) { return __builtin_ctanf128(__z); }
    812  1.15       mrg 
    813  1.15       mrg   inline __complex__ _Float128
    814  1.15       mrg   __complex_tanh(__complex__ _Float128 __z) { return __builtin_ctanhf128(__z); }
    815  1.15       mrg 
    816  1.15       mrg   inline __complex__ _Float128
    817  1.15       mrg   __complex_pow(__complex__ _Float128 __x, __complex__ _Float128 __y)
    818  1.15       mrg   { return __builtin_cpowf128(__x, __y); }
    819  1.15       mrg #endif
    820  1.15       mrg 
    821  1.15       mrg #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
    822  1.15       mrg   inline __gnu_cxx::__bfloat16_t
    823  1.15       mrg   __complex_abs(__complex__ decltype(0.0bf16) __z)
    824  1.15       mrg   { return __gnu_cxx::__bfloat16_t(__builtin_cabsf(__z)); }
    825  1.15       mrg 
    826  1.15       mrg   inline __gnu_cxx::__bfloat16_t
    827  1.15       mrg   __complex_arg(__complex__ decltype(0.0bf16) __z)
    828  1.15       mrg   { return __gnu_cxx::__bfloat16_t(__builtin_cargf(__z)); }
    829  1.15       mrg 
    830  1.15       mrg   inline __complex__ decltype(0.0bf16)
    831  1.15       mrg   __complex_cos(__complex__ decltype(0.0bf16) __z)
    832  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ccosf(__z)); }
    833  1.15       mrg 
    834  1.15       mrg   inline __complex__ decltype(0.0bf16)
    835  1.15       mrg   __complex_cosh(__complex__ decltype(0.0bf16) __z)
    836  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ccoshf(__z)); }
    837  1.15       mrg 
    838  1.15       mrg   inline __complex__ decltype(0.0bf16)
    839  1.15       mrg   __complex_exp(__complex__ decltype(0.0bf16) __z)
    840  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cexpf(__z)); }
    841  1.15       mrg 
    842  1.15       mrg   inline __complex__ decltype(0.0bf16)
    843  1.15       mrg   __complex_log(__complex__ decltype(0.0bf16) __z)
    844  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_clogf(__z)); }
    845  1.15       mrg 
    846  1.15       mrg   inline __complex__ decltype(0.0bf16)
    847  1.15       mrg   __complex_sin(__complex__ decltype(0.0bf16) __z)
    848  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_csinf(__z)); }
    849  1.15       mrg 
    850  1.15       mrg   inline __complex__ decltype(0.0bf16)
    851  1.15       mrg   __complex_sinh(__complex__ decltype(0.0bf16) __z)
    852  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_csinhf(__z)); }
    853  1.15       mrg 
    854  1.15       mrg   inline __complex__ decltype(0.0bf16)
    855  1.15       mrg   __complex_sqrt(__complex__ decltype(0.0bf16) __z)
    856  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_csqrtf(__z)); }
    857  1.15       mrg 
    858  1.15       mrg   inline __complex__ decltype(0.0bf16)
    859  1.15       mrg   __complex_tan(__complex__ decltype(0.0bf16) __z)
    860  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ctanf(__z)); }
    861  1.15       mrg 
    862  1.15       mrg   inline __complex__ decltype(0.0bf16)
    863  1.15       mrg   __complex_tanh(__complex__ decltype(0.0bf16) __z)
    864  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_ctanhf(__z)); }
    865  1.15       mrg 
    866  1.15       mrg   inline __complex__ decltype(0.0bf16)
    867  1.15       mrg   __complex_pow(__complex__ decltype(0.0bf16) __x,
    868  1.15       mrg 		__complex__ decltype(0.0bf16) __y)
    869  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cpowf(__x,
    870  1.15       mrg 								      __y)); }
    871  1.15       mrg #endif
    872  1.15       mrg #endif
    873  1.15       mrg 
    874   1.1       mrg   // 26.2.7/3 abs(__z):  Returns the magnitude of __z.
    875   1.1       mrg   template<typename _Tp>
    876   1.1       mrg     inline _Tp
    877   1.1       mrg     __complex_abs(const complex<_Tp>& __z)
    878   1.1       mrg     {
    879   1.1       mrg       _Tp __x = __z.real();
    880   1.1       mrg       _Tp __y = __z.imag();
    881   1.1       mrg       const _Tp __s = std::max(abs(__x), abs(__y));
    882   1.1       mrg       if (__s == _Tp())  // well ...
    883   1.1       mrg         return __s;
    884   1.8       mrg       __x /= __s;
    885   1.1       mrg       __y /= __s;
    886   1.1       mrg       return __s * sqrt(__x * __x + __y * __y);
    887   1.1       mrg     }
    888   1.1       mrg 
    889   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
    890   1.2  christos   // XXX: We can't use __builtin_cabs* because they are broken
    891   1.1       mrg   inline float
    892   1.2  christos   __complex_abs(__complex__ float __z) { return __c99_cabsf(__z); }
    893   1.1       mrg 
    894   1.1       mrg   inline double
    895   1.2  christos   __complex_abs(__complex__ double __z) { return __c99_cabs(__z); }
    896   1.1       mrg 
    897   1.1       mrg   inline long double
    898   1.1       mrg   __complex_abs(const __complex__ long double& __z)
    899   1.2  christos   { return __c99_cabsl(__z); }
    900   1.1       mrg 
    901   1.1       mrg   template<typename _Tp>
    902   1.1       mrg     inline _Tp
    903   1.1       mrg     abs(const complex<_Tp>& __z) { return __complex_abs(__z.__rep()); }
    904   1.1       mrg #else
    905   1.1       mrg   template<typename _Tp>
    906   1.1       mrg     inline _Tp
    907   1.1       mrg     abs(const complex<_Tp>& __z) { return __complex_abs(__z); }
    908   1.8       mrg #endif
    909   1.1       mrg 
    910   1.1       mrg 
    911   1.1       mrg   // 26.2.7/4: arg(__z): Returns the phase angle of __z.
    912   1.1       mrg   template<typename _Tp>
    913   1.1       mrg     inline _Tp
    914   1.1       mrg     __complex_arg(const complex<_Tp>& __z)
    915   1.1       mrg     { return  atan2(__z.imag(), __z.real()); }
    916   1.1       mrg 
    917   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
    918   1.1       mrg   inline float
    919   1.1       mrg   __complex_arg(__complex__ float __z) { return __builtin_cargf(__z); }
    920   1.1       mrg 
    921   1.1       mrg   inline double
    922   1.1       mrg   __complex_arg(__complex__ double __z) { return __builtin_carg(__z); }
    923   1.1       mrg 
    924   1.1       mrg   inline long double
    925   1.1       mrg   __complex_arg(const __complex__ long double& __z)
    926   1.1       mrg   { return __builtin_cargl(__z); }
    927   1.1       mrg 
    928   1.1       mrg   template<typename _Tp>
    929   1.1       mrg     inline _Tp
    930   1.1       mrg     arg(const complex<_Tp>& __z) { return __complex_arg(__z.__rep()); }
    931   1.1       mrg #else
    932   1.1       mrg   template<typename _Tp>
    933   1.1       mrg     inline _Tp
    934   1.1       mrg     arg(const complex<_Tp>& __z) { return __complex_arg(__z); }
    935   1.1       mrg #endif
    936   1.1       mrg 
    937   1.1       mrg   // 26.2.7/5: norm(__z) returns the squared magnitude of __z.
    938   1.1       mrg   //     As defined, norm() is -not- a norm is the common mathematical
    939   1.4       mrg   //     sense used in numerics.  The helper class _Norm_helper<> tries to
    940   1.1       mrg   //     distinguish between builtin floating point and the rest, so as
    941   1.1       mrg   //     to deliver an answer as close as possible to the real value.
    942   1.1       mrg   template<bool>
    943   1.1       mrg     struct _Norm_helper
    944   1.1       mrg     {
    945   1.1       mrg       template<typename _Tp>
    946  1.10       mrg         static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z)
    947   1.1       mrg         {
    948   1.1       mrg           const _Tp __x = __z.real();
    949   1.1       mrg           const _Tp __y = __z.imag();
    950   1.1       mrg           return __x * __x + __y * __y;
    951   1.1       mrg         }
    952   1.1       mrg     };
    953   1.1       mrg 
    954   1.1       mrg   template<>
    955   1.1       mrg     struct _Norm_helper<true>
    956   1.1       mrg     {
    957   1.1       mrg       template<typename _Tp>
    958  1.10       mrg         static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z)
    959   1.1       mrg         {
    960  1.10       mrg           //_Tp __res = std::abs(__z);
    961  1.10       mrg           //return __res * __res;
    962  1.10       mrg           const _Tp __x = __z.real();
    963  1.10       mrg           const _Tp __y = __z.imag();
    964  1.10       mrg           return __x * __x + __y * __y;
    965   1.1       mrg         }
    966   1.1       mrg     };
    967   1.8       mrg 
    968   1.1       mrg   template<typename _Tp>
    969  1.10       mrg     inline _GLIBCXX20_CONSTEXPR _Tp
    970   1.1       mrg     norm(const complex<_Tp>& __z)
    971   1.1       mrg     {
    972   1.8       mrg       return _Norm_helper<__is_floating<_Tp>::__value
    973   1.1       mrg 	&& !_GLIBCXX_FAST_MATH>::_S_do_it(__z);
    974   1.1       mrg     }
    975   1.1       mrg 
    976   1.1       mrg   template<typename _Tp>
    977   1.1       mrg     inline complex<_Tp>
    978   1.1       mrg     polar(const _Tp& __rho, const _Tp& __theta)
    979   1.6       mrg     {
    980   1.6       mrg       __glibcxx_assert( __rho >= 0 );
    981   1.6       mrg       return complex<_Tp>(__rho * cos(__theta), __rho * sin(__theta));
    982   1.6       mrg     }
    983   1.1       mrg 
    984   1.1       mrg   template<typename _Tp>
    985  1.10       mrg     inline _GLIBCXX20_CONSTEXPR complex<_Tp>
    986   1.1       mrg     conj(const complex<_Tp>& __z)
    987   1.1       mrg     { return complex<_Tp>(__z.real(), -__z.imag()); }
    988   1.8       mrg 
    989   1.1       mrg   // Transcendentals
    990   1.1       mrg 
    991   1.1       mrg   // 26.2.8/1 cos(__z):  Returns the cosine of __z.
    992   1.1       mrg   template<typename _Tp>
    993   1.1       mrg     inline complex<_Tp>
    994   1.1       mrg     __complex_cos(const complex<_Tp>& __z)
    995   1.1       mrg     {
    996   1.1       mrg       const _Tp __x = __z.real();
    997   1.1       mrg       const _Tp __y = __z.imag();
    998   1.1       mrg       return complex<_Tp>(cos(__x) * cosh(__y), -sin(__x) * sinh(__y));
    999   1.1       mrg     }
   1000   1.1       mrg 
   1001   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1002   1.1       mrg   inline __complex__ float
   1003   1.1       mrg   __complex_cos(__complex__ float __z) { return __builtin_ccosf(__z); }
   1004   1.1       mrg 
   1005   1.1       mrg   inline __complex__ double
   1006   1.1       mrg   __complex_cos(__complex__ double __z) { return __builtin_ccos(__z); }
   1007   1.1       mrg 
   1008   1.1       mrg   inline __complex__ long double
   1009   1.1       mrg   __complex_cos(const __complex__ long double& __z)
   1010   1.1       mrg   { return __builtin_ccosl(__z); }
   1011   1.1       mrg 
   1012   1.1       mrg   template<typename _Tp>
   1013   1.1       mrg     inline complex<_Tp>
   1014   1.1       mrg     cos(const complex<_Tp>& __z) { return __complex_cos(__z.__rep()); }
   1015   1.1       mrg #else
   1016   1.1       mrg   template<typename _Tp>
   1017   1.1       mrg     inline complex<_Tp>
   1018   1.1       mrg     cos(const complex<_Tp>& __z) { return __complex_cos(__z); }
   1019   1.1       mrg #endif
   1020   1.1       mrg 
   1021   1.1       mrg   // 26.2.8/2 cosh(__z): Returns the hyperbolic cosine of __z.
   1022   1.1       mrg   template<typename _Tp>
   1023   1.1       mrg     inline complex<_Tp>
   1024   1.1       mrg     __complex_cosh(const complex<_Tp>& __z)
   1025   1.1       mrg     {
   1026   1.1       mrg       const _Tp __x = __z.real();
   1027   1.1       mrg       const _Tp __y = __z.imag();
   1028   1.1       mrg       return complex<_Tp>(cosh(__x) * cos(__y), sinh(__x) * sin(__y));
   1029   1.1       mrg     }
   1030   1.1       mrg 
   1031   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1032   1.1       mrg   inline __complex__ float
   1033   1.1       mrg   __complex_cosh(__complex__ float __z) { return __builtin_ccoshf(__z); }
   1034   1.1       mrg 
   1035   1.1       mrg   inline __complex__ double
   1036   1.1       mrg   __complex_cosh(__complex__ double __z) { return __builtin_ccosh(__z); }
   1037   1.1       mrg 
   1038   1.1       mrg   inline __complex__ long double
   1039   1.1       mrg   __complex_cosh(const __complex__ long double& __z)
   1040   1.1       mrg   { return __builtin_ccoshl(__z); }
   1041   1.1       mrg 
   1042   1.1       mrg   template<typename _Tp>
   1043   1.1       mrg     inline complex<_Tp>
   1044   1.1       mrg     cosh(const complex<_Tp>& __z) { return __complex_cosh(__z.__rep()); }
   1045   1.1       mrg #else
   1046   1.1       mrg   template<typename _Tp>
   1047   1.1       mrg     inline complex<_Tp>
   1048   1.1       mrg     cosh(const complex<_Tp>& __z) { return __complex_cosh(__z); }
   1049   1.1       mrg #endif
   1050   1.1       mrg 
   1051   1.1       mrg   // 26.2.8/3 exp(__z): Returns the complex base e exponential of x
   1052   1.1       mrg   template<typename _Tp>
   1053   1.1       mrg     inline complex<_Tp>
   1054   1.1       mrg     __complex_exp(const complex<_Tp>& __z)
   1055   1.4       mrg     { return std::polar<_Tp>(exp(__z.real()), __z.imag()); }
   1056   1.1       mrg 
   1057   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1058   1.1       mrg   inline __complex__ float
   1059   1.1       mrg   __complex_exp(__complex__ float __z) { return __builtin_cexpf(__z); }
   1060   1.1       mrg 
   1061   1.1       mrg   inline __complex__ double
   1062   1.1       mrg   __complex_exp(__complex__ double __z) { return __builtin_cexp(__z); }
   1063   1.1       mrg 
   1064   1.1       mrg   inline __complex__ long double
   1065   1.1       mrg   __complex_exp(const __complex__ long double& __z)
   1066   1.1       mrg   { return __builtin_cexpl(__z); }
   1067   1.1       mrg 
   1068   1.1       mrg   template<typename _Tp>
   1069   1.1       mrg     inline complex<_Tp>
   1070   1.1       mrg     exp(const complex<_Tp>& __z) { return __complex_exp(__z.__rep()); }
   1071   1.1       mrg #else
   1072   1.1       mrg   template<typename _Tp>
   1073   1.1       mrg     inline complex<_Tp>
   1074   1.1       mrg     exp(const complex<_Tp>& __z) { return __complex_exp(__z); }
   1075   1.1       mrg #endif
   1076   1.1       mrg 
   1077   1.1       mrg   // 26.2.8/5 log(__z): Returns the natural complex logarithm of __z.
   1078   1.1       mrg   //                    The branch cut is along the negative axis.
   1079   1.1       mrg   template<typename _Tp>
   1080   1.1       mrg     inline complex<_Tp>
   1081   1.1       mrg     __complex_log(const complex<_Tp>& __z)
   1082   1.1       mrg     { return complex<_Tp>(log(std::abs(__z)), std::arg(__z)); }
   1083   1.1       mrg 
   1084   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1085   1.1       mrg   inline __complex__ float
   1086   1.1       mrg   __complex_log(__complex__ float __z) { return __builtin_clogf(__z); }
   1087   1.1       mrg 
   1088   1.1       mrg   inline __complex__ double
   1089   1.1       mrg   __complex_log(__complex__ double __z) { return __builtin_clog(__z); }
   1090   1.1       mrg 
   1091   1.1       mrg   inline __complex__ long double
   1092   1.1       mrg   __complex_log(const __complex__ long double& __z)
   1093   1.1       mrg   { return __builtin_clogl(__z); }
   1094   1.1       mrg 
   1095   1.1       mrg   template<typename _Tp>
   1096   1.1       mrg     inline complex<_Tp>
   1097   1.1       mrg     log(const complex<_Tp>& __z) { return __complex_log(__z.__rep()); }
   1098   1.1       mrg #else
   1099   1.1       mrg   template<typename _Tp>
   1100   1.1       mrg     inline complex<_Tp>
   1101   1.1       mrg     log(const complex<_Tp>& __z) { return __complex_log(__z); }
   1102   1.1       mrg #endif
   1103   1.1       mrg 
   1104   1.1       mrg   template<typename _Tp>
   1105   1.1       mrg     inline complex<_Tp>
   1106   1.1       mrg     log10(const complex<_Tp>& __z)
   1107   1.1       mrg     { return std::log(__z) / log(_Tp(10.0)); }
   1108   1.1       mrg 
   1109   1.1       mrg   // 26.2.8/10 sin(__z): Returns the sine of __z.
   1110   1.1       mrg   template<typename _Tp>
   1111   1.1       mrg     inline complex<_Tp>
   1112   1.1       mrg     __complex_sin(const complex<_Tp>& __z)
   1113   1.1       mrg     {
   1114   1.1       mrg       const _Tp __x = __z.real();
   1115   1.1       mrg       const _Tp __y = __z.imag();
   1116   1.8       mrg       return complex<_Tp>(sin(__x) * cosh(__y), cos(__x) * sinh(__y));
   1117   1.1       mrg     }
   1118   1.1       mrg 
   1119   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1120   1.1       mrg   inline __complex__ float
   1121   1.1       mrg   __complex_sin(__complex__ float __z) { return __builtin_csinf(__z); }
   1122   1.1       mrg 
   1123   1.1       mrg   inline __complex__ double
   1124   1.1       mrg   __complex_sin(__complex__ double __z) { return __builtin_csin(__z); }
   1125   1.1       mrg 
   1126   1.1       mrg   inline __complex__ long double
   1127   1.1       mrg   __complex_sin(const __complex__ long double& __z)
   1128   1.1       mrg   { return __builtin_csinl(__z); }
   1129   1.1       mrg 
   1130   1.1       mrg   template<typename _Tp>
   1131   1.1       mrg     inline complex<_Tp>
   1132   1.1       mrg     sin(const complex<_Tp>& __z) { return __complex_sin(__z.__rep()); }
   1133   1.1       mrg #else
   1134   1.1       mrg   template<typename _Tp>
   1135   1.1       mrg     inline complex<_Tp>
   1136   1.1       mrg     sin(const complex<_Tp>& __z) { return __complex_sin(__z); }
   1137   1.1       mrg #endif
   1138   1.1       mrg 
   1139   1.1       mrg   // 26.2.8/11 sinh(__z): Returns the hyperbolic sine of __z.
   1140   1.1       mrg   template<typename _Tp>
   1141   1.1       mrg     inline complex<_Tp>
   1142   1.1       mrg     __complex_sinh(const complex<_Tp>& __z)
   1143   1.1       mrg     {
   1144   1.1       mrg       const _Tp __x = __z.real();
   1145   1.1       mrg       const _Tp  __y = __z.imag();
   1146   1.1       mrg       return complex<_Tp>(sinh(__x) * cos(__y), cosh(__x) * sin(__y));
   1147   1.1       mrg     }
   1148   1.1       mrg 
   1149   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1150   1.1       mrg   inline __complex__ float
   1151   1.8       mrg   __complex_sinh(__complex__ float __z) { return __builtin_csinhf(__z); }
   1152   1.1       mrg 
   1153   1.1       mrg   inline __complex__ double
   1154   1.8       mrg   __complex_sinh(__complex__ double __z) { return __builtin_csinh(__z); }
   1155   1.1       mrg 
   1156   1.1       mrg   inline __complex__ long double
   1157   1.1       mrg   __complex_sinh(const __complex__ long double& __z)
   1158   1.8       mrg   { return __builtin_csinhl(__z); }
   1159   1.1       mrg 
   1160   1.1       mrg   template<typename _Tp>
   1161   1.1       mrg     inline complex<_Tp>
   1162   1.1       mrg     sinh(const complex<_Tp>& __z) { return __complex_sinh(__z.__rep()); }
   1163   1.1       mrg #else
   1164   1.1       mrg   template<typename _Tp>
   1165   1.1       mrg     inline complex<_Tp>
   1166   1.1       mrg     sinh(const complex<_Tp>& __z) { return __complex_sinh(__z); }
   1167   1.1       mrg #endif
   1168   1.1       mrg 
   1169   1.1       mrg   // 26.2.8/13 sqrt(__z): Returns the complex square root of __z.
   1170   1.1       mrg   //                     The branch cut is on the negative axis.
   1171   1.1       mrg   template<typename _Tp>
   1172   1.1       mrg     complex<_Tp>
   1173   1.1       mrg     __complex_sqrt(const complex<_Tp>& __z)
   1174   1.1       mrg     {
   1175   1.1       mrg       _Tp __x = __z.real();
   1176   1.1       mrg       _Tp __y = __z.imag();
   1177   1.1       mrg 
   1178   1.1       mrg       if (__x == _Tp())
   1179   1.1       mrg         {
   1180   1.1       mrg           _Tp __t = sqrt(abs(__y) / 2);
   1181   1.1       mrg           return complex<_Tp>(__t, __y < _Tp() ? -__t : __t);
   1182   1.1       mrg         }
   1183   1.1       mrg       else
   1184   1.1       mrg         {
   1185   1.1       mrg           _Tp __t = sqrt(2 * (std::abs(__z) + abs(__x)));
   1186   1.1       mrg           _Tp __u = __t / 2;
   1187   1.1       mrg           return __x > _Tp()
   1188   1.1       mrg             ? complex<_Tp>(__u, __y / __t)
   1189   1.1       mrg             : complex<_Tp>(abs(__y) / __t, __y < _Tp() ? -__u : __u);
   1190   1.1       mrg         }
   1191   1.1       mrg     }
   1192   1.1       mrg 
   1193   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1194   1.1       mrg   inline __complex__ float
   1195   1.1       mrg   __complex_sqrt(__complex__ float __z) { return __builtin_csqrtf(__z); }
   1196   1.1       mrg 
   1197   1.1       mrg   inline __complex__ double
   1198   1.1       mrg   __complex_sqrt(__complex__ double __z) { return __builtin_csqrt(__z); }
   1199   1.1       mrg 
   1200   1.1       mrg   inline __complex__ long double
   1201   1.1       mrg   __complex_sqrt(const __complex__ long double& __z)
   1202   1.1       mrg   { return __builtin_csqrtl(__z); }
   1203   1.1       mrg 
   1204   1.1       mrg   template<typename _Tp>
   1205   1.1       mrg     inline complex<_Tp>
   1206   1.1       mrg     sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z.__rep()); }
   1207   1.1       mrg #else
   1208   1.1       mrg   template<typename _Tp>
   1209   1.1       mrg     inline complex<_Tp>
   1210   1.1       mrg     sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z); }
   1211   1.1       mrg #endif
   1212   1.1       mrg 
   1213   1.1       mrg   // 26.2.8/14 tan(__z):  Return the complex tangent of __z.
   1214   1.8       mrg 
   1215   1.1       mrg   template<typename _Tp>
   1216   1.1       mrg     inline complex<_Tp>
   1217   1.1       mrg     __complex_tan(const complex<_Tp>& __z)
   1218   1.1       mrg     { return std::sin(__z) / std::cos(__z); }
   1219   1.1       mrg 
   1220   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1221   1.1       mrg   inline __complex__ float
   1222   1.1       mrg   __complex_tan(__complex__ float __z) { return __builtin_ctanf(__z); }
   1223   1.1       mrg 
   1224   1.1       mrg   inline __complex__ double
   1225   1.1       mrg   __complex_tan(__complex__ double __z) { return __builtin_ctan(__z); }
   1226   1.1       mrg 
   1227   1.1       mrg   inline __complex__ long double
   1228   1.1       mrg   __complex_tan(const __complex__ long double& __z)
   1229   1.1       mrg   { return __builtin_ctanl(__z); }
   1230   1.1       mrg 
   1231   1.1       mrg   template<typename _Tp>
   1232   1.1       mrg     inline complex<_Tp>
   1233   1.1       mrg     tan(const complex<_Tp>& __z) { return __complex_tan(__z.__rep()); }
   1234   1.1       mrg #else
   1235   1.1       mrg   template<typename _Tp>
   1236   1.1       mrg     inline complex<_Tp>
   1237   1.1       mrg     tan(const complex<_Tp>& __z) { return __complex_tan(__z); }
   1238   1.1       mrg #endif
   1239   1.1       mrg 
   1240   1.1       mrg 
   1241   1.1       mrg   // 26.2.8/15 tanh(__z):  Returns the hyperbolic tangent of __z.
   1242   1.8       mrg 
   1243   1.1       mrg   template<typename _Tp>
   1244   1.1       mrg     inline complex<_Tp>
   1245   1.1       mrg     __complex_tanh(const complex<_Tp>& __z)
   1246   1.1       mrg     { return std::sinh(__z) / std::cosh(__z); }
   1247   1.1       mrg 
   1248   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1249   1.1       mrg   inline __complex__ float
   1250   1.1       mrg   __complex_tanh(__complex__ float __z) { return __builtin_ctanhf(__z); }
   1251   1.1       mrg 
   1252   1.1       mrg   inline __complex__ double
   1253   1.1       mrg   __complex_tanh(__complex__ double __z) { return __builtin_ctanh(__z); }
   1254   1.1       mrg 
   1255   1.1       mrg   inline __complex__ long double
   1256   1.1       mrg   __complex_tanh(const __complex__ long double& __z)
   1257   1.1       mrg   { return __builtin_ctanhl(__z); }
   1258   1.1       mrg 
   1259   1.1       mrg   template<typename _Tp>
   1260   1.1       mrg     inline complex<_Tp>
   1261   1.1       mrg     tanh(const complex<_Tp>& __z) { return __complex_tanh(__z.__rep()); }
   1262   1.1       mrg #else
   1263   1.1       mrg   template<typename _Tp>
   1264   1.1       mrg     inline complex<_Tp>
   1265   1.1       mrg     tanh(const complex<_Tp>& __z) { return __complex_tanh(__z); }
   1266   1.1       mrg #endif
   1267   1.1       mrg 
   1268   1.1       mrg 
   1269   1.1       mrg   // 26.2.8/9  pow(__x, __y): Returns the complex power base of __x
   1270   1.1       mrg   //                          raised to the __y-th power.  The branch
   1271   1.1       mrg   //                          cut is on the negative axis.
   1272   1.2  christos   template<typename _Tp>
   1273   1.2  christos     complex<_Tp>
   1274   1.2  christos     __complex_pow_unsigned(complex<_Tp> __x, unsigned __n)
   1275   1.2  christos     {
   1276   1.2  christos       complex<_Tp> __y = __n % 2 ? __x : complex<_Tp>(1);
   1277   1.2  christos 
   1278   1.2  christos       while (__n >>= 1)
   1279   1.2  christos         {
   1280   1.2  christos           __x *= __x;
   1281   1.2  christos           if (__n % 2)
   1282   1.2  christos             __y *= __x;
   1283   1.2  christos         }
   1284   1.2  christos 
   1285   1.2  christos       return __y;
   1286   1.2  christos     }
   1287   1.2  christos 
   1288   1.4       mrg   // In C++11 mode we used to implement the resolution of
   1289   1.1       mrg   // DR 844. complex pow return type is ambiguous.
   1290   1.4       mrg   // thus the following overload was disabled in that mode.  However, doing
   1291   1.4       mrg   // that causes all sorts of issues, see, for example:
   1292   1.4       mrg   //   http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html
   1293   1.4       mrg   // and also PR57974.
   1294   1.1       mrg   template<typename _Tp>
   1295   1.1       mrg     inline complex<_Tp>
   1296   1.1       mrg     pow(const complex<_Tp>& __z, int __n)
   1297   1.2  christos     {
   1298   1.2  christos       return __n < 0
   1299   1.2  christos 	? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n)
   1300   1.2  christos         : std::__complex_pow_unsigned(__z, __n);
   1301   1.2  christos     }
   1302   1.1       mrg 
   1303   1.1       mrg   template<typename _Tp>
   1304   1.1       mrg     complex<_Tp>
   1305   1.1       mrg     pow(const complex<_Tp>& __x, const _Tp& __y)
   1306   1.1       mrg     {
   1307   1.6       mrg #if ! _GLIBCXX_USE_C99_COMPLEX
   1308   1.1       mrg       if (__x == _Tp())
   1309   1.1       mrg 	return _Tp();
   1310   1.1       mrg #endif
   1311   1.1       mrg       if (__x.imag() == _Tp() && __x.real() > _Tp())
   1312   1.1       mrg         return pow(__x.real(), __y);
   1313   1.1       mrg 
   1314   1.1       mrg       complex<_Tp> __t = std::log(__x);
   1315   1.4       mrg       return std::polar<_Tp>(exp(__y * __t.real()), __y * __t.imag());
   1316   1.1       mrg     }
   1317   1.1       mrg 
   1318   1.1       mrg   template<typename _Tp>
   1319   1.1       mrg     inline complex<_Tp>
   1320   1.1       mrg     __complex_pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
   1321   1.1       mrg     { return __x == _Tp() ? _Tp() : std::exp(__y * std::log(__x)); }
   1322   1.1       mrg 
   1323   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   1324   1.1       mrg   inline __complex__ float
   1325   1.1       mrg   __complex_pow(__complex__ float __x, __complex__ float __y)
   1326   1.1       mrg   { return __builtin_cpowf(__x, __y); }
   1327   1.1       mrg 
   1328   1.1       mrg   inline __complex__ double
   1329   1.1       mrg   __complex_pow(__complex__ double __x, __complex__ double __y)
   1330   1.1       mrg   { return __builtin_cpow(__x, __y); }
   1331   1.1       mrg 
   1332   1.1       mrg   inline __complex__ long double
   1333   1.1       mrg   __complex_pow(const __complex__ long double& __x,
   1334   1.1       mrg 		const __complex__ long double& __y)
   1335   1.1       mrg   { return __builtin_cpowl(__x, __y); }
   1336   1.1       mrg 
   1337   1.1       mrg   template<typename _Tp>
   1338   1.1       mrg     inline complex<_Tp>
   1339   1.1       mrg     pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
   1340   1.1       mrg     { return __complex_pow(__x.__rep(), __y.__rep()); }
   1341   1.1       mrg #else
   1342   1.1       mrg   template<typename _Tp>
   1343   1.1       mrg     inline complex<_Tp>
   1344   1.1       mrg     pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
   1345   1.1       mrg     { return __complex_pow(__x, __y); }
   1346   1.1       mrg #endif
   1347   1.1       mrg 
   1348   1.1       mrg   template<typename _Tp>
   1349   1.1       mrg     inline complex<_Tp>
   1350   1.1       mrg     pow(const _Tp& __x, const complex<_Tp>& __y)
   1351   1.1       mrg     {
   1352   1.4       mrg       return __x > _Tp() ? std::polar<_Tp>(pow(__x, __y.real()),
   1353   1.4       mrg 					   __y.imag() * log(__x))
   1354   1.1       mrg 	                 : std::pow(complex<_Tp>(__x), __y);
   1355   1.1       mrg     }
   1356   1.1       mrg 
   1357   1.2  christos   /// 26.2.3  complex specializations
   1358   1.2  christos   /// complex<float> specialization
   1359   1.1       mrg   template<>
   1360  1.13       mrg     class complex<float>
   1361   1.1       mrg     {
   1362  1.13       mrg     public:
   1363   1.1       mrg       typedef float value_type;
   1364   1.1       mrg       typedef __complex__ float _ComplexT;
   1365   1.1       mrg 
   1366   1.2  christos       _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
   1367   1.1       mrg 
   1368   1.2  christos       _GLIBCXX_CONSTEXPR complex(float __r = 0.0f, float __i = 0.0f)
   1369   1.2  christos #if __cplusplus >= 201103L
   1370   1.2  christos       : _M_value{ __r, __i } { }
   1371   1.2  christos #else
   1372   1.1       mrg       {
   1373   1.1       mrg 	__real__ _M_value = __r;
   1374   1.1       mrg 	__imag__ _M_value = __i;
   1375   1.1       mrg       }
   1376   1.2  christos #endif
   1377   1.1       mrg 
   1378  1.14       mrg #if __cplusplus >= 201103L
   1379  1.14       mrg       _GLIBCXX14_CONSTEXPR complex(const complex&) = default;
   1380  1.14       mrg #endif
   1381  1.14       mrg 
   1382  1.15       mrg #if __cplusplus > 202002L
   1383  1.15       mrg       template<typename _Up>
   1384  1.15       mrg 	explicit(!requires(_Up __u) { value_type{__u}; })
   1385  1.15       mrg 	constexpr complex(const complex<_Up>& __z)
   1386  1.15       mrg 	: _M_value{ value_type(__z.real()), value_type(__z.imag()) } { }
   1387  1.15       mrg #else
   1388   1.2  christos       explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&);
   1389   1.8       mrg       explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
   1390  1.15       mrg #endif
   1391   1.1       mrg 
   1392   1.2  christos #if __cplusplus >= 201103L
   1393   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1394   1.1       mrg       // DR 387. std::complex over-encapsulated.
   1395   1.2  christos       __attribute ((__abi_tag__ ("cxx11")))
   1396   1.8       mrg       constexpr float
   1397   1.4       mrg       real() const { return __real__ _M_value; }
   1398   1.2  christos 
   1399   1.2  christos       __attribute ((__abi_tag__ ("cxx11")))
   1400   1.8       mrg       constexpr float
   1401   1.4       mrg       imag() const { return __imag__ _M_value; }
   1402   1.1       mrg #else
   1403   1.8       mrg       float&
   1404   1.2  christos       real() { return __real__ _M_value; }
   1405   1.1       mrg 
   1406   1.8       mrg       const float&
   1407   1.8       mrg       real() const { return __real__ _M_value; }
   1408   1.1       mrg 
   1409   1.8       mrg       float&
   1410   1.2  christos       imag() { return __imag__ _M_value; }
   1411   1.1       mrg 
   1412   1.8       mrg       const float&
   1413   1.2  christos       imag() const { return __imag__ _M_value; }
   1414   1.1       mrg #endif
   1415   1.1       mrg 
   1416   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1417   1.1       mrg       // DR 387. std::complex over-encapsulated.
   1418  1.10       mrg       _GLIBCXX20_CONSTEXPR void
   1419   1.2  christos       real(float __val) { __real__ _M_value = __val; }
   1420   1.1       mrg 
   1421  1.10       mrg       _GLIBCXX20_CONSTEXPR void
   1422   1.2  christos       imag(float __val) { __imag__ _M_value = __val; }
   1423   1.1       mrg 
   1424  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1425   1.1       mrg       operator=(float __f)
   1426   1.1       mrg       {
   1427   1.2  christos 	_M_value = __f;
   1428   1.1       mrg 	return *this;
   1429   1.1       mrg       }
   1430   1.1       mrg 
   1431  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1432   1.1       mrg       operator+=(float __f)
   1433   1.1       mrg       {
   1434   1.2  christos 	_M_value += __f;
   1435   1.1       mrg 	return *this;
   1436   1.1       mrg       }
   1437   1.1       mrg 
   1438  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1439   1.1       mrg       operator-=(float __f)
   1440   1.1       mrg       {
   1441   1.2  christos 	_M_value -= __f;
   1442   1.1       mrg 	return *this;
   1443   1.1       mrg       }
   1444   1.1       mrg 
   1445  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1446   1.1       mrg       operator*=(float __f)
   1447   1.1       mrg       {
   1448   1.1       mrg 	_M_value *= __f;
   1449   1.1       mrg 	return *this;
   1450   1.1       mrg       }
   1451   1.1       mrg 
   1452  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1453   1.1       mrg       operator/=(float __f)
   1454   1.1       mrg       {
   1455   1.1       mrg 	_M_value /= __f;
   1456   1.1       mrg 	return *this;
   1457   1.1       mrg       }
   1458   1.1       mrg 
   1459   1.1       mrg       // Let the compiler synthesize the copy and assignment
   1460   1.1       mrg       // operator.  It always does a pretty good job.
   1461  1.10       mrg #if __cplusplus >= 201103L
   1462  1.10       mrg       _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
   1463  1.10       mrg #endif
   1464   1.1       mrg 
   1465   1.1       mrg       template<typename _Tp>
   1466  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1467   1.1       mrg         operator=(const complex<_Tp>&  __z)
   1468   1.1       mrg 	{
   1469   1.1       mrg 	  __real__ _M_value = __z.real();
   1470   1.1       mrg 	  __imag__ _M_value = __z.imag();
   1471   1.1       mrg 	  return *this;
   1472   1.1       mrg 	}
   1473   1.1       mrg 
   1474   1.1       mrg       template<typename _Tp>
   1475  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1476   1.1       mrg         operator+=(const complex<_Tp>& __z)
   1477   1.1       mrg 	{
   1478  1.10       mrg 	  _M_value += __z.__rep();
   1479   1.1       mrg 	  return *this;
   1480   1.1       mrg 	}
   1481   1.1       mrg 
   1482   1.1       mrg       template<class _Tp>
   1483  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1484   1.1       mrg         operator-=(const complex<_Tp>& __z)
   1485   1.1       mrg 	{
   1486  1.10       mrg 	  _M_value -= __z.__rep();
   1487   1.1       mrg 	  return *this;
   1488   1.1       mrg 	}
   1489   1.1       mrg 
   1490   1.1       mrg       template<class _Tp>
   1491  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1492   1.1       mrg         operator*=(const complex<_Tp>& __z)
   1493   1.1       mrg 	{
   1494  1.10       mrg 	  const _ComplexT __t = __z.__rep();
   1495   1.1       mrg 	  _M_value *= __t;
   1496   1.1       mrg 	  return *this;
   1497   1.1       mrg 	}
   1498   1.1       mrg 
   1499   1.1       mrg       template<class _Tp>
   1500  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1501   1.1       mrg         operator/=(const complex<_Tp>& __z)
   1502   1.1       mrg 	{
   1503  1.10       mrg 	  const _ComplexT __t = __z.__rep();
   1504   1.1       mrg 	  _M_value /= __t;
   1505   1.1       mrg 	  return *this;
   1506   1.1       mrg 	}
   1507   1.1       mrg 
   1508   1.4       mrg       _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
   1509   1.1       mrg 
   1510   1.1       mrg     private:
   1511   1.1       mrg       _ComplexT _M_value;
   1512   1.1       mrg     };
   1513   1.1       mrg 
   1514   1.2  christos   /// 26.2.3  complex specializations
   1515   1.2  christos   /// complex<double> specialization
   1516   1.1       mrg   template<>
   1517  1.13       mrg     class complex<double>
   1518   1.1       mrg     {
   1519  1.13       mrg     public:
   1520   1.1       mrg       typedef double value_type;
   1521   1.1       mrg       typedef __complex__ double _ComplexT;
   1522   1.1       mrg 
   1523   1.2  christos       _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
   1524   1.1       mrg 
   1525   1.2  christos       _GLIBCXX_CONSTEXPR complex(double __r = 0.0, double __i = 0.0)
   1526   1.2  christos #if __cplusplus >= 201103L
   1527   1.2  christos       : _M_value{ __r, __i } { }
   1528   1.2  christos #else
   1529   1.1       mrg       {
   1530   1.1       mrg 	__real__ _M_value = __r;
   1531   1.1       mrg 	__imag__ _M_value = __i;
   1532   1.1       mrg       }
   1533   1.2  christos #endif
   1534   1.1       mrg 
   1535  1.14       mrg #if __cplusplus >= 201103L
   1536  1.14       mrg       _GLIBCXX14_CONSTEXPR complex(const complex&) = default;
   1537  1.14       mrg #endif
   1538  1.14       mrg 
   1539  1.15       mrg #if __cplusplus > 202002L
   1540  1.15       mrg       template<typename _Up>
   1541  1.15       mrg 	explicit(!requires(_Up __u) { value_type{__u}; })
   1542  1.15       mrg 	constexpr complex(const complex<_Up>& __z)
   1543  1.15       mrg 	: _M_value{ value_type(__z.real()), value_type(__z.imag()) } { }
   1544  1.15       mrg #else
   1545   1.2  christos       _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
   1546   1.1       mrg       : _M_value(__z.__rep()) { }
   1547   1.1       mrg 
   1548   1.8       mrg       explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
   1549  1.15       mrg #endif
   1550   1.1       mrg 
   1551   1.2  christos #if __cplusplus >= 201103L
   1552   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1553   1.1       mrg       // DR 387. std::complex over-encapsulated.
   1554   1.2  christos       __attribute ((__abi_tag__ ("cxx11")))
   1555   1.8       mrg       constexpr double
   1556   1.4       mrg       real() const { return __real__ _M_value; }
   1557   1.2  christos 
   1558   1.2  christos       __attribute ((__abi_tag__ ("cxx11")))
   1559   1.8       mrg       constexpr double
   1560   1.4       mrg       imag() const { return __imag__ _M_value; }
   1561   1.1       mrg #else
   1562   1.8       mrg       double&
   1563   1.2  christos       real() { return __real__ _M_value; }
   1564   1.1       mrg 
   1565   1.8       mrg       const double&
   1566   1.2  christos       real() const { return __real__ _M_value; }
   1567   1.1       mrg 
   1568   1.8       mrg       double&
   1569   1.2  christos       imag() { return __imag__ _M_value; }
   1570   1.1       mrg 
   1571   1.8       mrg       const double&
   1572   1.2  christos       imag() const { return __imag__ _M_value; }
   1573   1.1       mrg #endif
   1574   1.1       mrg 
   1575   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1576   1.1       mrg       // DR 387. std::complex over-encapsulated.
   1577  1.10       mrg       _GLIBCXX20_CONSTEXPR void
   1578   1.2  christos       real(double __val) { __real__ _M_value = __val; }
   1579   1.1       mrg 
   1580  1.10       mrg       _GLIBCXX20_CONSTEXPR void
   1581   1.2  christos       imag(double __val) { __imag__ _M_value = __val; }
   1582   1.1       mrg 
   1583  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1584   1.1       mrg       operator=(double __d)
   1585   1.1       mrg       {
   1586   1.2  christos 	_M_value = __d;
   1587   1.1       mrg 	return *this;
   1588   1.1       mrg       }
   1589   1.1       mrg 
   1590  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1591   1.1       mrg       operator+=(double __d)
   1592   1.1       mrg       {
   1593   1.2  christos 	_M_value += __d;
   1594   1.1       mrg 	return *this;
   1595   1.1       mrg       }
   1596   1.8       mrg 
   1597  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1598   1.1       mrg       operator-=(double __d)
   1599   1.1       mrg       {
   1600   1.2  christos 	_M_value -= __d;
   1601   1.1       mrg 	return *this;
   1602   1.1       mrg       }
   1603   1.1       mrg 
   1604  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1605   1.1       mrg       operator*=(double __d)
   1606   1.1       mrg       {
   1607   1.1       mrg 	_M_value *= __d;
   1608   1.1       mrg 	return *this;
   1609   1.1       mrg       }
   1610   1.1       mrg 
   1611  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1612   1.1       mrg       operator/=(double __d)
   1613   1.1       mrg       {
   1614   1.1       mrg 	_M_value /= __d;
   1615   1.1       mrg 	return *this;
   1616   1.1       mrg       }
   1617   1.1       mrg 
   1618   1.1       mrg       // The compiler will synthesize this, efficiently.
   1619  1.10       mrg #if __cplusplus >= 201103L
   1620  1.10       mrg       _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
   1621  1.10       mrg #endif
   1622   1.1       mrg 
   1623   1.1       mrg       template<typename _Tp>
   1624  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1625   1.1       mrg         operator=(const complex<_Tp>& __z)
   1626   1.1       mrg 	{
   1627  1.10       mrg 	  _M_value = __z.__rep();
   1628   1.1       mrg 	  return *this;
   1629   1.1       mrg 	}
   1630   1.1       mrg 
   1631   1.1       mrg       template<typename _Tp>
   1632  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1633   1.1       mrg         operator+=(const complex<_Tp>& __z)
   1634   1.1       mrg 	{
   1635  1.10       mrg 	  _M_value += __z.__rep();
   1636   1.1       mrg 	  return *this;
   1637   1.1       mrg 	}
   1638   1.1       mrg 
   1639   1.1       mrg       template<typename _Tp>
   1640  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1641   1.1       mrg         operator-=(const complex<_Tp>& __z)
   1642   1.1       mrg 	{
   1643  1.10       mrg 	  _M_value -= __z.__rep();
   1644   1.1       mrg 	  return *this;
   1645   1.1       mrg 	}
   1646   1.1       mrg 
   1647   1.1       mrg       template<typename _Tp>
   1648  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1649   1.1       mrg         operator*=(const complex<_Tp>& __z)
   1650   1.1       mrg 	{
   1651  1.10       mrg 	  const _ComplexT __t = __z.__rep();
   1652   1.1       mrg 	  _M_value *= __t;
   1653   1.1       mrg 	  return *this;
   1654   1.1       mrg 	}
   1655   1.1       mrg 
   1656   1.1       mrg       template<typename _Tp>
   1657  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1658   1.1       mrg         operator/=(const complex<_Tp>& __z)
   1659   1.1       mrg 	{
   1660  1.10       mrg 	  const _ComplexT __t = __z.__rep();
   1661   1.1       mrg 	  _M_value /= __t;
   1662   1.1       mrg 	  return *this;
   1663   1.1       mrg 	}
   1664   1.1       mrg 
   1665   1.4       mrg       _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
   1666   1.1       mrg 
   1667   1.1       mrg     private:
   1668   1.1       mrg       _ComplexT _M_value;
   1669   1.1       mrg     };
   1670   1.1       mrg 
   1671   1.2  christos   /// 26.2.3  complex specializations
   1672   1.2  christos   /// complex<long double> specialization
   1673   1.1       mrg   template<>
   1674  1.13       mrg     class complex<long double>
   1675   1.1       mrg     {
   1676  1.13       mrg     public:
   1677   1.1       mrg       typedef long double value_type;
   1678   1.1       mrg       typedef __complex__ long double _ComplexT;
   1679   1.1       mrg 
   1680   1.2  christos       _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
   1681   1.1       mrg 
   1682   1.8       mrg       _GLIBCXX_CONSTEXPR complex(long double __r = 0.0L,
   1683   1.2  christos 				 long double __i = 0.0L)
   1684   1.2  christos #if __cplusplus >= 201103L
   1685   1.2  christos       : _M_value{ __r, __i } { }
   1686   1.2  christos #else
   1687   1.1       mrg       {
   1688   1.1       mrg 	__real__ _M_value = __r;
   1689   1.1       mrg 	__imag__ _M_value = __i;
   1690   1.1       mrg       }
   1691   1.2  christos #endif
   1692   1.1       mrg 
   1693  1.14       mrg #if __cplusplus >= 201103L
   1694  1.14       mrg       _GLIBCXX14_CONSTEXPR complex(const complex&) = default;
   1695  1.14       mrg #endif
   1696  1.14       mrg 
   1697  1.15       mrg #if __cplusplus > 202002L
   1698  1.15       mrg       template<typename _Up>
   1699  1.15       mrg 	explicit(!requires(_Up __u) { value_type{__u}; })
   1700  1.15       mrg 	constexpr complex(const complex<_Up>& __z)
   1701  1.15       mrg 	: _M_value{ value_type(__z.real()), value_type(__z.imag()) } { }
   1702  1.15       mrg #else
   1703   1.2  christos       _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
   1704   1.1       mrg       : _M_value(__z.__rep()) { }
   1705   1.1       mrg 
   1706   1.2  christos       _GLIBCXX_CONSTEXPR complex(const complex<double>& __z)
   1707   1.1       mrg       : _M_value(__z.__rep()) { }
   1708  1.15       mrg #endif
   1709   1.1       mrg 
   1710   1.2  christos #if __cplusplus >= 201103L
   1711   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1712   1.1       mrg       // DR 387. std::complex over-encapsulated.
   1713   1.2  christos       __attribute ((__abi_tag__ ("cxx11")))
   1714   1.8       mrg       constexpr long double
   1715   1.4       mrg       real() const { return __real__ _M_value; }
   1716   1.2  christos 
   1717   1.2  christos       __attribute ((__abi_tag__ ("cxx11")))
   1718   1.8       mrg       constexpr long double
   1719   1.4       mrg       imag() const { return __imag__ _M_value; }
   1720   1.1       mrg #else
   1721   1.8       mrg       long double&
   1722   1.2  christos       real() { return __real__ _M_value; }
   1723   1.1       mrg 
   1724   1.8       mrg       const long double&
   1725   1.2  christos       real() const { return __real__ _M_value; }
   1726   1.1       mrg 
   1727   1.8       mrg       long double&
   1728   1.2  christos       imag() { return __imag__ _M_value; }
   1729   1.1       mrg 
   1730   1.8       mrg       const long double&
   1731   1.2  christos       imag() const { return __imag__ _M_value; }
   1732   1.1       mrg #endif
   1733   1.1       mrg 
   1734   1.1       mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1735   1.1       mrg       // DR 387. std::complex over-encapsulated.
   1736  1.10       mrg       _GLIBCXX20_CONSTEXPR void
   1737   1.2  christos       real(long double __val) { __real__ _M_value = __val; }
   1738   1.1       mrg 
   1739  1.10       mrg       _GLIBCXX20_CONSTEXPR void
   1740   1.2  christos       imag(long double __val) { __imag__ _M_value = __val; }
   1741   1.1       mrg 
   1742  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1743   1.1       mrg       operator=(long double __r)
   1744   1.1       mrg       {
   1745   1.2  christos 	_M_value = __r;
   1746   1.1       mrg 	return *this;
   1747   1.1       mrg       }
   1748   1.1       mrg 
   1749  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1750   1.1       mrg       operator+=(long double __r)
   1751   1.1       mrg       {
   1752   1.2  christos 	_M_value += __r;
   1753   1.1       mrg 	return *this;
   1754   1.1       mrg       }
   1755   1.1       mrg 
   1756  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1757   1.1       mrg       operator-=(long double __r)
   1758   1.1       mrg       {
   1759   1.2  christos 	_M_value -= __r;
   1760   1.1       mrg 	return *this;
   1761   1.1       mrg       }
   1762   1.1       mrg 
   1763  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1764   1.1       mrg       operator*=(long double __r)
   1765   1.1       mrg       {
   1766   1.1       mrg 	_M_value *= __r;
   1767   1.1       mrg 	return *this;
   1768   1.1       mrg       }
   1769   1.1       mrg 
   1770  1.10       mrg       _GLIBCXX20_CONSTEXPR complex&
   1771   1.1       mrg       operator/=(long double __r)
   1772   1.1       mrg       {
   1773   1.1       mrg 	_M_value /= __r;
   1774   1.1       mrg 	return *this;
   1775   1.1       mrg       }
   1776   1.1       mrg 
   1777   1.1       mrg       // The compiler knows how to do this efficiently
   1778  1.10       mrg #if __cplusplus >= 201103L
   1779  1.10       mrg       _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
   1780  1.10       mrg #endif
   1781   1.1       mrg 
   1782   1.1       mrg       template<typename _Tp>
   1783  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1784   1.1       mrg         operator=(const complex<_Tp>& __z)
   1785   1.1       mrg 	{
   1786  1.10       mrg 	  _M_value = __z.__rep();
   1787   1.1       mrg 	  return *this;
   1788   1.1       mrg 	}
   1789   1.1       mrg 
   1790   1.1       mrg       template<typename _Tp>
   1791  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1792   1.1       mrg 	operator+=(const complex<_Tp>& __z)
   1793   1.1       mrg 	{
   1794  1.10       mrg 	  _M_value += __z.__rep();
   1795   1.1       mrg 	  return *this;
   1796   1.1       mrg 	}
   1797   1.1       mrg 
   1798   1.1       mrg       template<typename _Tp>
   1799  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1800   1.1       mrg 	operator-=(const complex<_Tp>& __z)
   1801   1.1       mrg 	{
   1802  1.10       mrg 	  _M_value -= __z.__rep();
   1803   1.1       mrg 	  return *this;
   1804   1.1       mrg 	}
   1805   1.1       mrg 
   1806   1.1       mrg       template<typename _Tp>
   1807  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1808   1.1       mrg 	operator*=(const complex<_Tp>& __z)
   1809   1.1       mrg 	{
   1810  1.10       mrg 	  const _ComplexT __t = __z.__rep();
   1811   1.1       mrg 	  _M_value *= __t;
   1812   1.1       mrg 	  return *this;
   1813   1.1       mrg 	}
   1814   1.1       mrg 
   1815   1.1       mrg       template<typename _Tp>
   1816  1.10       mrg         _GLIBCXX20_CONSTEXPR complex&
   1817   1.1       mrg 	operator/=(const complex<_Tp>& __z)
   1818   1.1       mrg 	{
   1819  1.10       mrg 	  const _ComplexT __t = __z.__rep();
   1820   1.1       mrg 	  _M_value /= __t;
   1821   1.1       mrg 	  return *this;
   1822   1.1       mrg 	}
   1823   1.1       mrg 
   1824   1.4       mrg       _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
   1825   1.1       mrg 
   1826   1.1       mrg     private:
   1827   1.1       mrg       _ComplexT _M_value;
   1828   1.1       mrg     };
   1829   1.1       mrg 
   1830  1.15       mrg #if __cplusplus > 202002L
   1831  1.15       mrg   template<typename _Tp>
   1832  1.15       mrg     struct __complex_type
   1833  1.15       mrg     { };
   1834  1.15       mrg 
   1835  1.15       mrg #ifdef __STDCPP_FLOAT16_T__
   1836  1.15       mrg   template<>
   1837  1.15       mrg     struct __complex_type<_Float16>
   1838  1.15       mrg     { typedef __complex__ _Float16 type; };
   1839  1.15       mrg #endif
   1840  1.15       mrg 
   1841  1.15       mrg #ifdef __STDCPP_FLOAT32_T__
   1842  1.15       mrg   template<>
   1843  1.15       mrg     struct __complex_type<_Float32>
   1844  1.15       mrg     { typedef __complex__ _Float32 type; };
   1845  1.15       mrg #endif
   1846  1.15       mrg 
   1847  1.15       mrg #ifdef __STDCPP_FLOAT64_T__
   1848  1.15       mrg   template<>
   1849  1.15       mrg     struct __complex_type<_Float64>
   1850  1.15       mrg     { typedef __complex__ _Float64 type; };
   1851  1.15       mrg #endif
   1852  1.15       mrg 
   1853  1.15       mrg #ifdef __STDCPP_FLOAT128_T__
   1854  1.15       mrg   template<>
   1855  1.15       mrg     struct __complex_type<_Float128>
   1856  1.15       mrg     { typedef __complex__ _Float128 type; };
   1857  1.15       mrg #endif
   1858  1.15       mrg 
   1859  1.15       mrg #ifdef __STDCPP_BFLOAT16_T__
   1860  1.15       mrg   template<>
   1861  1.15       mrg     struct __complex_type<__gnu_cxx::__bfloat16_t>
   1862  1.15       mrg     { typedef __complex__ decltype(0.0bf16) type; };
   1863  1.15       mrg #endif
   1864  1.15       mrg 
   1865  1.15       mrg   template<typename _Tp>
   1866  1.15       mrg     requires requires { typename __complex_type<_Tp>::type; }
   1867  1.15       mrg     class complex<_Tp>
   1868  1.15       mrg     {
   1869  1.15       mrg     public:
   1870  1.15       mrg       typedef _Tp value_type;
   1871  1.15       mrg       typedef typename std::__complex_type<_Tp>::type _ComplexT;
   1872  1.15       mrg 
   1873  1.15       mrg       constexpr complex(_ComplexT __z) : _M_value(__z) { }
   1874  1.15       mrg 
   1875  1.15       mrg       constexpr complex(_Tp __r = _Tp(), _Tp __i = _Tp())
   1876  1.15       mrg       : _M_value{ __r, __i } { }
   1877  1.15       mrg 
   1878  1.15       mrg       template<typename _Up>
   1879  1.15       mrg 	explicit(!requires(_Up __u) { value_type{__u}; })
   1880  1.15       mrg 	constexpr complex(const complex<_Up>& __z)
   1881  1.15       mrg 	: _M_value{ value_type(__z.real()), value_type(__z.imag()) } { }
   1882  1.15       mrg 
   1883  1.15       mrg       constexpr _Tp
   1884  1.15       mrg       real() const { return __real__ _M_value; }
   1885  1.15       mrg 
   1886  1.15       mrg       constexpr _Tp
   1887  1.15       mrg       imag() const { return __imag__ _M_value; }
   1888  1.15       mrg 
   1889  1.15       mrg       constexpr void
   1890  1.15       mrg       real(_Tp __val) { __real__ _M_value = __val; }
   1891  1.15       mrg 
   1892  1.15       mrg       constexpr void
   1893  1.15       mrg       imag(_Tp __val) { __imag__ _M_value = __val; }
   1894  1.15       mrg 
   1895  1.15       mrg       constexpr complex&
   1896  1.15       mrg       operator=(_Tp __f)
   1897  1.15       mrg       {
   1898  1.15       mrg 	_M_value = __f;
   1899  1.15       mrg 	return *this;
   1900  1.15       mrg       }
   1901  1.15       mrg 
   1902  1.15       mrg       constexpr complex&
   1903  1.15       mrg       operator+=(_Tp __f)
   1904  1.15       mrg       {
   1905  1.15       mrg 	_M_value += __f;
   1906  1.15       mrg 	return *this;
   1907  1.15       mrg       }
   1908  1.15       mrg 
   1909  1.15       mrg       constexpr complex&
   1910  1.15       mrg       operator-=(_Tp __f)
   1911  1.15       mrg       {
   1912  1.15       mrg 	_M_value -= __f;
   1913  1.15       mrg 	return *this;
   1914  1.15       mrg       }
   1915  1.15       mrg 
   1916  1.15       mrg       constexpr complex&
   1917  1.15       mrg       operator*=(_Tp __f)
   1918  1.15       mrg       {
   1919  1.15       mrg 	_M_value *= __f;
   1920  1.15       mrg 	return *this;
   1921  1.15       mrg       }
   1922  1.15       mrg 
   1923  1.15       mrg       constexpr complex&
   1924  1.15       mrg       operator/=(_Tp __f)
   1925  1.15       mrg       {
   1926  1.15       mrg 	_M_value /= __f;
   1927  1.15       mrg 	return *this;
   1928  1.15       mrg       }
   1929  1.15       mrg 
   1930  1.15       mrg       // Let the compiler synthesize the copy and assignment
   1931  1.15       mrg       // operator.  It always does a pretty good job.
   1932  1.15       mrg       constexpr complex(const complex&) = default;
   1933  1.15       mrg       constexpr complex& operator=(const complex&) = default;
   1934  1.15       mrg 
   1935  1.15       mrg       template<typename _Up>
   1936  1.15       mrg 	constexpr complex&
   1937  1.15       mrg 	operator=(const complex<_Up>&  __z)
   1938  1.15       mrg 	{
   1939  1.15       mrg 	  __real__ _M_value = __z.real();
   1940  1.15       mrg 	  __imag__ _M_value = __z.imag();
   1941  1.15       mrg 	  return *this;
   1942  1.15       mrg 	}
   1943  1.15       mrg 
   1944  1.15       mrg       template<typename _Up>
   1945  1.15       mrg 	constexpr complex&
   1946  1.15       mrg 	operator+=(const complex<_Up>& __z)
   1947  1.15       mrg 	{
   1948  1.15       mrg 	  _M_value += __z.__rep();
   1949  1.15       mrg 	  return *this;
   1950  1.15       mrg 	}
   1951  1.15       mrg 
   1952  1.15       mrg       template<class _Up>
   1953  1.15       mrg 	constexpr complex&
   1954  1.15       mrg 	operator-=(const complex<_Up>& __z)
   1955  1.15       mrg 	{
   1956  1.15       mrg 	  _M_value -= __z.__rep();
   1957  1.15       mrg 	  return *this;
   1958  1.15       mrg 	}
   1959  1.15       mrg 
   1960  1.15       mrg       template<class _Up>
   1961  1.15       mrg 	constexpr complex&
   1962  1.15       mrg 	operator*=(const complex<_Up>& __z)
   1963  1.15       mrg 	{
   1964  1.15       mrg 	  const _ComplexT __t = __z.__rep();
   1965  1.15       mrg 	  _M_value *= __t;
   1966  1.15       mrg 	  return *this;
   1967  1.15       mrg 	}
   1968  1.15       mrg 
   1969  1.15       mrg       template<class _Up>
   1970  1.15       mrg 	constexpr complex&
   1971  1.15       mrg 	operator/=(const complex<_Up>& __z)
   1972  1.15       mrg 	{
   1973  1.15       mrg 	  const _ComplexT __t = __z.__rep();
   1974  1.15       mrg 	  _M_value /= __t;
   1975  1.15       mrg 	  return *this;
   1976  1.15       mrg 	}
   1977  1.15       mrg 
   1978  1.15       mrg       constexpr _ComplexT __rep() const { return _M_value; }
   1979  1.15       mrg 
   1980  1.15       mrg     private:
   1981  1.15       mrg       _ComplexT _M_value;
   1982  1.15       mrg     };
   1983  1.15       mrg #endif
   1984  1.15       mrg 
   1985  1.15       mrg #if __cplusplus <= 202002L
   1986   1.1       mrg   // These bits have to be at the end of this file, so that the
   1987   1.1       mrg   // specializations have all been defined.
   1988   1.2  christos   inline _GLIBCXX_CONSTEXPR
   1989   1.1       mrg   complex<float>::complex(const complex<double>& __z)
   1990   1.1       mrg   : _M_value(__z.__rep()) { }
   1991   1.1       mrg 
   1992   1.2  christos   inline _GLIBCXX_CONSTEXPR
   1993   1.1       mrg   complex<float>::complex(const complex<long double>& __z)
   1994   1.1       mrg   : _M_value(__z.__rep()) { }
   1995   1.1       mrg 
   1996   1.2  christos   inline _GLIBCXX_CONSTEXPR
   1997   1.1       mrg   complex<double>::complex(const complex<long double>& __z)
   1998   1.1       mrg   : _M_value(__z.__rep()) { }
   1999  1.15       mrg #endif
   2000   1.1       mrg 
   2001   1.1       mrg   // Inhibit implicit instantiations for required instantiations,
   2002   1.1       mrg   // which are defined via explicit instantiations elsewhere.
   2003   1.1       mrg   // NB:  This syntax is a GNU extension.
   2004   1.1       mrg #if _GLIBCXX_EXTERN_TEMPLATE
   2005   1.1       mrg   extern template istream& operator>>(istream&, complex<float>&);
   2006   1.1       mrg   extern template ostream& operator<<(ostream&, const complex<float>&);
   2007   1.1       mrg   extern template istream& operator>>(istream&, complex<double>&);
   2008   1.1       mrg   extern template ostream& operator<<(ostream&, const complex<double>&);
   2009   1.1       mrg   extern template istream& operator>>(istream&, complex<long double>&);
   2010   1.1       mrg   extern template ostream& operator<<(ostream&, const complex<long double>&);
   2011   1.1       mrg 
   2012   1.1       mrg #ifdef _GLIBCXX_USE_WCHAR_T
   2013   1.1       mrg   extern template wistream& operator>>(wistream&, complex<float>&);
   2014   1.1       mrg   extern template wostream& operator<<(wostream&, const complex<float>&);
   2015   1.1       mrg   extern template wistream& operator>>(wistream&, complex<double>&);
   2016   1.1       mrg   extern template wostream& operator<<(wostream&, const complex<double>&);
   2017   1.1       mrg   extern template wistream& operator>>(wistream&, complex<long double>&);
   2018   1.1       mrg   extern template wostream& operator<<(wostream&, const complex<long double>&);
   2019   1.1       mrg #endif
   2020   1.1       mrg #endif
   2021   1.1       mrg 
   2022  1.12       mrg   /// @} group complex_numbers
   2023   1.1       mrg 
   2024   1.2  christos _GLIBCXX_END_NAMESPACE_VERSION
   2025   1.2  christos } // namespace
   2026   1.1       mrg 
   2027   1.2  christos #if __cplusplus >= 201103L
   2028   1.1       mrg 
   2029   1.2  christos namespace std _GLIBCXX_VISIBILITY(default)
   2030   1.2  christos {
   2031   1.2  christos _GLIBCXX_BEGIN_NAMESPACE_VERSION
   2032   1.2  christos 
   2033   1.2  christos   // Forward declarations.
   2034   1.2  christos   template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&);
   2035   1.2  christos   template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&);
   2036   1.2  christos   template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&);
   2037   1.2  christos 
   2038   1.2  christos   template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&);
   2039   1.2  christos   template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&);
   2040   1.2  christos   template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&);
   2041   1.2  christos   // DR 595.
   2042   1.2  christos   template<typename _Tp> _Tp               fabs(const std::complex<_Tp>&);
   2043   1.2  christos 
   2044   1.2  christos   template<typename _Tp>
   2045   1.2  christos     inline std::complex<_Tp>
   2046   1.2  christos     __complex_acos(const std::complex<_Tp>& __z)
   2047   1.2  christos     {
   2048   1.2  christos       const std::complex<_Tp> __t = std::asin(__z);
   2049   1.2  christos       const _Tp __pi_2 = 1.5707963267948966192313216916397514L;
   2050   1.2  christos       return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
   2051   1.2  christos     }
   2052   1.2  christos 
   2053  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2054  1.15       mrg #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   2055  1.15       mrg   inline __complex__ _Float16
   2056  1.15       mrg   __complex_acos(__complex__ _Float16 __z)
   2057  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_cacosf(__z)); }
   2058  1.15       mrg 
   2059  1.15       mrg   inline __complex__ _Float16
   2060  1.15       mrg   __complex_asin(__complex__ _Float16 __z)
   2061  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_casinf(__z)); }
   2062  1.15       mrg 
   2063  1.15       mrg   inline __complex__ _Float16
   2064  1.15       mrg   __complex_atan(__complex__ _Float16 __z)
   2065  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_catanf(__z)); }
   2066  1.15       mrg 
   2067  1.15       mrg   inline __complex__ _Float16
   2068  1.15       mrg   __complex_acosh(__complex__ _Float16 __z)
   2069  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_cacoshf(__z)); }
   2070  1.15       mrg 
   2071  1.15       mrg   inline __complex__ _Float16
   2072  1.15       mrg   __complex_asinh(__complex__ _Float16 __z)
   2073  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_casinhf(__z)); }
   2074  1.15       mrg 
   2075  1.15       mrg   inline __complex__ _Float16
   2076  1.15       mrg   __complex_atanh(__complex__ _Float16 __z)
   2077  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_catanhf(__z)); }
   2078  1.15       mrg #endif
   2079  1.15       mrg 
   2080  1.15       mrg #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   2081  1.15       mrg   inline __complex__ _Float32
   2082  1.15       mrg   __complex_acos(__complex__ _Float32 __z)
   2083  1.15       mrg   { return __builtin_cacosf(__z); }
   2084  1.15       mrg 
   2085  1.15       mrg   inline __complex__ _Float32
   2086  1.15       mrg   __complex_asin(__complex__ _Float32 __z)
   2087  1.15       mrg   { return __builtin_casinf(__z); }
   2088  1.15       mrg 
   2089  1.15       mrg   inline __complex__ _Float32
   2090  1.15       mrg   __complex_atan(__complex__ _Float32 __z)
   2091  1.15       mrg   { return __builtin_catanf(__z); }
   2092  1.15       mrg 
   2093  1.15       mrg   inline __complex__ _Float32
   2094  1.15       mrg   __complex_acosh(__complex__ _Float32 __z)
   2095  1.15       mrg   { return __builtin_cacoshf(__z); }
   2096  1.15       mrg 
   2097  1.15       mrg   inline __complex__ _Float32
   2098  1.15       mrg   __complex_asinh(__complex__ _Float32 __z)
   2099  1.15       mrg   { return __builtin_casinhf(__z); }
   2100  1.15       mrg 
   2101  1.15       mrg   inline __complex__ _Float32
   2102  1.15       mrg   __complex_atanh(__complex__ _Float32 __z)
   2103  1.15       mrg   { return __builtin_catanhf(__z); }
   2104  1.15       mrg #endif
   2105  1.15       mrg 
   2106  1.15       mrg #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
   2107  1.15       mrg   inline __complex__ _Float64
   2108  1.15       mrg   __complex_acos(__complex__ _Float64 __z)
   2109  1.15       mrg   { return __builtin_cacos(__z); }
   2110  1.15       mrg 
   2111  1.15       mrg   inline __complex__ _Float64
   2112  1.15       mrg   __complex_asin(__complex__ _Float64 __z)
   2113  1.15       mrg   { return __builtin_casin(__z); }
   2114  1.15       mrg 
   2115  1.15       mrg   inline __complex__ _Float64
   2116  1.15       mrg   __complex_atan(__complex__ _Float64 __z)
   2117  1.15       mrg   { return __builtin_catan(__z); }
   2118  1.15       mrg 
   2119  1.15       mrg   inline __complex__ _Float64
   2120  1.15       mrg   __complex_acosh(__complex__ _Float64 __z)
   2121  1.15       mrg   { return __builtin_cacosh(__z); }
   2122  1.15       mrg 
   2123  1.15       mrg   inline __complex__ _Float64
   2124  1.15       mrg   __complex_asinh(__complex__ _Float64 __z)
   2125  1.15       mrg   { return __builtin_casinh(__z); }
   2126  1.15       mrg 
   2127  1.15       mrg   inline __complex__ _Float64
   2128  1.15       mrg   __complex_atanh(__complex__ _Float64 __z)
   2129  1.15       mrg   { return __builtin_catanh(__z); }
   2130  1.15       mrg #endif
   2131  1.15       mrg 
   2132  1.15       mrg #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
   2133  1.15       mrg   inline __complex__ _Float128
   2134  1.15       mrg   __complex_acos(__complex__ _Float128 __z)
   2135  1.15       mrg   { return __builtin_cacosl(__z); }
   2136  1.15       mrg 
   2137  1.15       mrg   inline __complex__ _Float128
   2138  1.15       mrg   __complex_asin(__complex__ _Float128 __z)
   2139  1.15       mrg   { return __builtin_casinl(__z); }
   2140  1.15       mrg 
   2141  1.15       mrg   inline __complex__ _Float128
   2142  1.15       mrg   __complex_atan(__complex__ _Float128 __z)
   2143  1.15       mrg   { return __builtin_catanl(__z); }
   2144  1.15       mrg 
   2145  1.15       mrg   inline __complex__ _Float128
   2146  1.15       mrg   __complex_acosh(__complex__ _Float128 __z)
   2147  1.15       mrg   { return __builtin_cacoshl(__z); }
   2148  1.15       mrg 
   2149  1.15       mrg   inline __complex__ _Float128
   2150  1.15       mrg   __complex_asinh(__complex__ _Float128 __z)
   2151  1.15       mrg   { return __builtin_casinhl(__z); }
   2152  1.15       mrg 
   2153  1.15       mrg   inline __complex__ _Float128
   2154  1.15       mrg   __complex_atanh(__complex__ _Float128 __z)
   2155  1.15       mrg   { return __builtin_catanhl(__z); }
   2156  1.15       mrg #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
   2157  1.15       mrg   inline __complex__ _Float128
   2158  1.15       mrg   __complex_acos(__complex__ _Float128 __z)
   2159  1.15       mrg   { return __builtin_cacosf128(__z); }
   2160  1.15       mrg 
   2161  1.15       mrg   inline __complex__ _Float128
   2162  1.15       mrg   __complex_asin(__complex__ _Float128 __z)
   2163  1.15       mrg   { return __builtin_casinf128(__z); }
   2164  1.15       mrg 
   2165  1.15       mrg   inline __complex__ _Float128
   2166  1.15       mrg   __complex_atan(__complex__ _Float128 __z)
   2167  1.15       mrg   { return __builtin_catanf128(__z); }
   2168  1.15       mrg 
   2169  1.15       mrg   inline __complex__ _Float128
   2170  1.15       mrg   __complex_acosh(__complex__ _Float128 __z)
   2171  1.15       mrg   { return __builtin_cacoshf128(__z); }
   2172  1.15       mrg 
   2173  1.15       mrg   inline __complex__ _Float128
   2174  1.15       mrg   __complex_asinh(__complex__ _Float128 __z)
   2175  1.15       mrg   { return __builtin_casinhf128(__z); }
   2176  1.15       mrg 
   2177  1.15       mrg   inline __complex__ _Float128
   2178  1.15       mrg   __complex_atanh(__complex__ _Float128 __z)
   2179  1.15       mrg   { return __builtin_catanhf128(__z); }
   2180  1.15       mrg #endif
   2181  1.15       mrg 
   2182  1.15       mrg #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   2183  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2184  1.15       mrg   __complex_acos(__complex__ decltype(0.0bf16) __z)
   2185  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cacosf(__z)); }
   2186  1.15       mrg 
   2187  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2188  1.15       mrg   __complex_asin(__complex__ decltype(0.0bf16) __z)
   2189  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_casinf(__z)); }
   2190  1.15       mrg 
   2191  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2192  1.15       mrg   __complex_atan(__complex__ decltype(0.0bf16) __z)
   2193  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_catanf(__z)); }
   2194  1.15       mrg 
   2195  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2196  1.15       mrg   __complex_acosh(__complex__ decltype(0.0bf16) __z)
   2197  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cacoshf(__z)); }
   2198  1.15       mrg 
   2199  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2200  1.15       mrg   __complex_asinh(__complex__ decltype(0.0bf16) __z)
   2201  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_casinhf(__z)); }
   2202  1.15       mrg 
   2203  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2204  1.15       mrg   __complex_atanh(__complex__ decltype(0.0bf16) __z)
   2205  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_catanhf(__z)); }
   2206  1.15       mrg #endif
   2207  1.15       mrg #endif
   2208  1.15       mrg 
   2209  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2210   1.2  christos   inline __complex__ float
   2211   1.2  christos   __complex_acos(__complex__ float __z)
   2212   1.2  christos   { return __builtin_cacosf(__z); }
   2213   1.2  christos 
   2214   1.2  christos   inline __complex__ double
   2215   1.2  christos   __complex_acos(__complex__ double __z)
   2216   1.2  christos   { return __builtin_cacos(__z); }
   2217   1.2  christos 
   2218   1.2  christos   inline __complex__ long double
   2219   1.2  christos   __complex_acos(const __complex__ long double& __z)
   2220   1.2  christos   { return __builtin_cacosl(__z); }
   2221   1.2  christos 
   2222   1.2  christos   template<typename _Tp>
   2223   1.2  christos     inline std::complex<_Tp>
   2224   1.2  christos     acos(const std::complex<_Tp>& __z)
   2225   1.2  christos     { return __complex_acos(__z.__rep()); }
   2226   1.2  christos #else
   2227   1.2  christos   /// acos(__z) [8.1.2].
   2228   1.2  christos   //  Effects:  Behaves the same as C99 function cacos, defined
   2229   1.2  christos   //            in subclause 7.3.5.1.
   2230   1.2  christos   template<typename _Tp>
   2231   1.2  christos     inline std::complex<_Tp>
   2232   1.2  christos     acos(const std::complex<_Tp>& __z)
   2233   1.2  christos     { return __complex_acos(__z); }
   2234   1.2  christos #endif
   2235   1.2  christos 
   2236   1.2  christos   template<typename _Tp>
   2237   1.2  christos     inline std::complex<_Tp>
   2238   1.2  christos     __complex_asin(const std::complex<_Tp>& __z)
   2239   1.2  christos     {
   2240   1.2  christos       std::complex<_Tp> __t(-__z.imag(), __z.real());
   2241   1.2  christos       __t = std::asinh(__t);
   2242   1.2  christos       return std::complex<_Tp>(__t.imag(), -__t.real());
   2243   1.2  christos     }
   2244   1.2  christos 
   2245  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2246   1.2  christos   inline __complex__ float
   2247   1.2  christos   __complex_asin(__complex__ float __z)
   2248   1.2  christos   { return __builtin_casinf(__z); }
   2249   1.2  christos 
   2250   1.2  christos   inline __complex__ double
   2251   1.2  christos   __complex_asin(__complex__ double __z)
   2252   1.2  christos   { return __builtin_casin(__z); }
   2253   1.2  christos 
   2254   1.2  christos   inline __complex__ long double
   2255   1.2  christos   __complex_asin(const __complex__ long double& __z)
   2256   1.2  christos   { return __builtin_casinl(__z); }
   2257   1.2  christos 
   2258   1.2  christos   template<typename _Tp>
   2259   1.2  christos     inline std::complex<_Tp>
   2260   1.2  christos     asin(const std::complex<_Tp>& __z)
   2261   1.2  christos     { return __complex_asin(__z.__rep()); }
   2262   1.2  christos #else
   2263   1.2  christos   /// asin(__z) [8.1.3].
   2264   1.2  christos   //  Effects:  Behaves the same as C99 function casin, defined
   2265   1.2  christos   //            in subclause 7.3.5.2.
   2266   1.2  christos   template<typename _Tp>
   2267   1.2  christos     inline std::complex<_Tp>
   2268   1.2  christos     asin(const std::complex<_Tp>& __z)
   2269   1.2  christos     { return __complex_asin(__z); }
   2270   1.2  christos #endif
   2271   1.8       mrg 
   2272   1.2  christos   template<typename _Tp>
   2273   1.2  christos     std::complex<_Tp>
   2274   1.2  christos     __complex_atan(const std::complex<_Tp>& __z)
   2275   1.2  christos     {
   2276   1.2  christos       const _Tp __r2 = __z.real() * __z.real();
   2277   1.2  christos       const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
   2278   1.2  christos 
   2279   1.2  christos       _Tp __num = __z.imag() + _Tp(1.0);
   2280   1.2  christos       _Tp __den = __z.imag() - _Tp(1.0);
   2281   1.2  christos 
   2282   1.2  christos       __num = __r2 + __num * __num;
   2283   1.2  christos       __den = __r2 + __den * __den;
   2284   1.2  christos 
   2285   1.2  christos       return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x),
   2286   1.2  christos 			       _Tp(0.25) * log(__num / __den));
   2287   1.2  christos     }
   2288   1.2  christos 
   2289  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2290   1.2  christos   inline __complex__ float
   2291   1.2  christos   __complex_atan(__complex__ float __z)
   2292   1.2  christos   { return __builtin_catanf(__z); }
   2293   1.2  christos 
   2294   1.2  christos   inline __complex__ double
   2295   1.2  christos   __complex_atan(__complex__ double __z)
   2296   1.2  christos   { return __builtin_catan(__z); }
   2297   1.2  christos 
   2298   1.2  christos   inline __complex__ long double
   2299   1.2  christos   __complex_atan(const __complex__ long double& __z)
   2300   1.2  christos   { return __builtin_catanl(__z); }
   2301   1.2  christos 
   2302   1.2  christos   template<typename _Tp>
   2303   1.2  christos     inline std::complex<_Tp>
   2304   1.2  christos     atan(const std::complex<_Tp>& __z)
   2305   1.2  christos     { return __complex_atan(__z.__rep()); }
   2306   1.2  christos #else
   2307   1.2  christos   /// atan(__z) [8.1.4].
   2308   1.2  christos   //  Effects:  Behaves the same as C99 function catan, defined
   2309   1.2  christos   //            in subclause 7.3.5.3.
   2310   1.2  christos   template<typename _Tp>
   2311   1.2  christos     inline std::complex<_Tp>
   2312   1.2  christos     atan(const std::complex<_Tp>& __z)
   2313   1.2  christos     { return __complex_atan(__z); }
   2314   1.2  christos #endif
   2315   1.2  christos 
   2316   1.2  christos   template<typename _Tp>
   2317   1.2  christos     std::complex<_Tp>
   2318   1.2  christos     __complex_acosh(const std::complex<_Tp>& __z)
   2319   1.2  christos     {
   2320   1.2  christos       // Kahan's formula.
   2321   1.2  christos       return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0)))
   2322   1.2  christos 				 + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
   2323   1.2  christos     }
   2324   1.2  christos 
   2325  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2326   1.2  christos   inline __complex__ float
   2327   1.2  christos   __complex_acosh(__complex__ float __z)
   2328   1.2  christos   { return __builtin_cacoshf(__z); }
   2329   1.2  christos 
   2330   1.2  christos   inline __complex__ double
   2331   1.2  christos   __complex_acosh(__complex__ double __z)
   2332   1.2  christos   { return __builtin_cacosh(__z); }
   2333   1.2  christos 
   2334   1.2  christos   inline __complex__ long double
   2335   1.2  christos   __complex_acosh(const __complex__ long double& __z)
   2336   1.2  christos   { return __builtin_cacoshl(__z); }
   2337   1.2  christos 
   2338   1.2  christos   template<typename _Tp>
   2339   1.2  christos     inline std::complex<_Tp>
   2340   1.2  christos     acosh(const std::complex<_Tp>& __z)
   2341   1.2  christos     { return __complex_acosh(__z.__rep()); }
   2342   1.2  christos #else
   2343   1.2  christos   /// acosh(__z) [8.1.5].
   2344   1.2  christos   //  Effects:  Behaves the same as C99 function cacosh, defined
   2345   1.2  christos   //            in subclause 7.3.6.1.
   2346   1.2  christos   template<typename _Tp>
   2347   1.2  christos     inline std::complex<_Tp>
   2348   1.2  christos     acosh(const std::complex<_Tp>& __z)
   2349   1.2  christos     { return __complex_acosh(__z); }
   2350   1.2  christos #endif
   2351   1.2  christos 
   2352   1.2  christos   template<typename _Tp>
   2353   1.2  christos     std::complex<_Tp>
   2354   1.2  christos     __complex_asinh(const std::complex<_Tp>& __z)
   2355   1.2  christos     {
   2356   1.2  christos       std::complex<_Tp> __t((__z.real() - __z.imag())
   2357   1.2  christos 			    * (__z.real() + __z.imag()) + _Tp(1.0),
   2358   1.2  christos 			    _Tp(2.0) * __z.real() * __z.imag());
   2359   1.2  christos       __t = std::sqrt(__t);
   2360   1.2  christos 
   2361   1.2  christos       return std::log(__t + __z);
   2362   1.2  christos     }
   2363   1.2  christos 
   2364  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2365   1.2  christos   inline __complex__ float
   2366   1.2  christos   __complex_asinh(__complex__ float __z)
   2367   1.2  christos   { return __builtin_casinhf(__z); }
   2368   1.2  christos 
   2369   1.2  christos   inline __complex__ double
   2370   1.2  christos   __complex_asinh(__complex__ double __z)
   2371   1.2  christos   { return __builtin_casinh(__z); }
   2372   1.2  christos 
   2373   1.2  christos   inline __complex__ long double
   2374   1.2  christos   __complex_asinh(const __complex__ long double& __z)
   2375   1.2  christos   { return __builtin_casinhl(__z); }
   2376   1.2  christos 
   2377   1.2  christos   template<typename _Tp>
   2378   1.2  christos     inline std::complex<_Tp>
   2379   1.2  christos     asinh(const std::complex<_Tp>& __z)
   2380   1.2  christos     { return __complex_asinh(__z.__rep()); }
   2381   1.2  christos #else
   2382   1.2  christos   /// asinh(__z) [8.1.6].
   2383   1.2  christos   //  Effects:  Behaves the same as C99 function casin, defined
   2384   1.2  christos   //            in subclause 7.3.6.2.
   2385   1.2  christos   template<typename _Tp>
   2386   1.2  christos     inline std::complex<_Tp>
   2387   1.2  christos     asinh(const std::complex<_Tp>& __z)
   2388   1.2  christos     { return __complex_asinh(__z); }
   2389   1.2  christos #endif
   2390   1.2  christos 
   2391   1.2  christos   template<typename _Tp>
   2392   1.2  christos     std::complex<_Tp>
   2393   1.2  christos     __complex_atanh(const std::complex<_Tp>& __z)
   2394   1.2  christos     {
   2395   1.2  christos       const _Tp __i2 = __z.imag() * __z.imag();
   2396   1.2  christos       const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
   2397   1.2  christos 
   2398   1.2  christos       _Tp __num = _Tp(1.0) + __z.real();
   2399   1.2  christos       _Tp __den = _Tp(1.0) - __z.real();
   2400   1.2  christos 
   2401   1.2  christos       __num = __i2 + __num * __num;
   2402   1.2  christos       __den = __i2 + __den * __den;
   2403   1.2  christos 
   2404   1.2  christos       return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)),
   2405   1.2  christos 			       _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
   2406   1.2  christos     }
   2407   1.2  christos 
   2408  1.15       mrg #if _GLIBCXX_USE_C99_COMPLEX_ARC
   2409   1.2  christos   inline __complex__ float
   2410   1.2  christos   __complex_atanh(__complex__ float __z)
   2411   1.2  christos   { return __builtin_catanhf(__z); }
   2412   1.2  christos 
   2413   1.2  christos   inline __complex__ double
   2414   1.2  christos   __complex_atanh(__complex__ double __z)
   2415   1.2  christos   { return __builtin_catanh(__z); }
   2416   1.2  christos 
   2417   1.2  christos   inline __complex__ long double
   2418   1.2  christos   __complex_atanh(const __complex__ long double& __z)
   2419   1.2  christos   { return __builtin_catanhl(__z); }
   2420   1.2  christos 
   2421   1.2  christos   template<typename _Tp>
   2422   1.2  christos     inline std::complex<_Tp>
   2423   1.2  christos     atanh(const std::complex<_Tp>& __z)
   2424   1.2  christos     { return __complex_atanh(__z.__rep()); }
   2425   1.2  christos #else
   2426   1.2  christos   /// atanh(__z) [8.1.7].
   2427   1.2  christos   //  Effects:  Behaves the same as C99 function catanh, defined
   2428   1.2  christos   //            in subclause 7.3.6.3.
   2429   1.2  christos   template<typename _Tp>
   2430   1.2  christos     inline std::complex<_Tp>
   2431   1.2  christos     atanh(const std::complex<_Tp>& __z)
   2432   1.2  christos     { return __complex_atanh(__z); }
   2433   1.2  christos #endif
   2434   1.2  christos 
   2435   1.2  christos   template<typename _Tp>
   2436   1.2  christos     inline _Tp
   2437   1.2  christos     /// fabs(__z) [8.1.8].
   2438   1.2  christos     //  Effects:  Behaves the same as C99 function cabs, defined
   2439   1.2  christos     //            in subclause 7.3.8.1.
   2440   1.2  christos     fabs(const std::complex<_Tp>& __z)
   2441   1.2  christos     { return std::abs(__z); }
   2442   1.2  christos 
   2443   1.2  christos   /// Additional overloads [8.1.9].
   2444   1.2  christos   template<typename _Tp>
   2445   1.2  christos     inline typename __gnu_cxx::__promote<_Tp>::__type
   2446   1.2  christos     arg(_Tp __x)
   2447   1.2  christos     {
   2448   1.2  christos       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   2449   1.6       mrg #if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC)
   2450   1.2  christos       return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L)
   2451   1.2  christos 	                       : __type();
   2452   1.2  christos #else
   2453   1.2  christos       return std::arg(std::complex<__type>(__x));
   2454   1.2  christos #endif
   2455   1.2  christos     }
   2456   1.2  christos 
   2457   1.2  christos   template<typename _Tp>
   2458   1.8       mrg     _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
   2459   1.2  christos     imag(_Tp)
   2460   1.2  christos     { return _Tp(); }
   2461   1.2  christos 
   2462   1.2  christos   template<typename _Tp>
   2463  1.10       mrg     _GLIBCXX20_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
   2464   1.2  christos     norm(_Tp __x)
   2465   1.2  christos     {
   2466   1.2  christos       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   2467   1.2  christos       return __type(__x) * __type(__x);
   2468   1.2  christos     }
   2469   1.2  christos 
   2470   1.2  christos   template<typename _Tp>
   2471   1.8       mrg     _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
   2472   1.2  christos     real(_Tp __x)
   2473   1.2  christos     { return __x; }
   2474   1.2  christos 
   2475   1.2  christos   template<typename _Tp, typename _Up>
   2476   1.2  christos     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
   2477   1.2  christos     pow(const std::complex<_Tp>& __x, const _Up& __y)
   2478   1.2  christos     {
   2479   1.2  christos       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
   2480   1.2  christos       return std::pow(std::complex<__type>(__x), __type(__y));
   2481   1.2  christos     }
   2482   1.2  christos 
   2483   1.2  christos   template<typename _Tp, typename _Up>
   2484   1.2  christos     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
   2485   1.2  christos     pow(const _Tp& __x, const std::complex<_Up>& __y)
   2486   1.2  christos     {
   2487   1.2  christos       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
   2488   1.2  christos       return std::pow(__type(__x), std::complex<__type>(__y));
   2489   1.2  christos     }
   2490   1.2  christos 
   2491   1.2  christos   template<typename _Tp, typename _Up>
   2492   1.2  christos     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
   2493   1.2  christos     pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y)
   2494   1.2  christos     {
   2495   1.2  christos       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
   2496   1.2  christos       return std::pow(std::complex<__type>(__x),
   2497   1.2  christos 		      std::complex<__type>(__y));
   2498   1.2  christos     }
   2499   1.1       mrg 
   2500   1.1       mrg   // Forward declarations.
   2501   1.1       mrg   // DR 781.
   2502  1.10       mrg   template<typename _Tp>
   2503  1.10       mrg     std::complex<_Tp> proj(const std::complex<_Tp>&);
   2504   1.1       mrg 
   2505  1.10       mrg   // Generic implementation of std::proj, does not work for infinities.
   2506   1.1       mrg   template<typename _Tp>
   2507  1.10       mrg     inline std::complex<_Tp>
   2508   1.1       mrg     __complex_proj(const std::complex<_Tp>& __z)
   2509  1.10       mrg     { return __z; }
   2510   1.1       mrg 
   2511   1.1       mrg #if _GLIBCXX_USE_C99_COMPLEX
   2512  1.10       mrg   inline complex<float>
   2513  1.10       mrg   __complex_proj(const complex<float>& __z)
   2514  1.10       mrg   { return __builtin_cprojf(__z.__rep()); }
   2515  1.10       mrg 
   2516  1.10       mrg   inline complex<double>
   2517  1.10       mrg   __complex_proj(const complex<double>& __z)
   2518  1.10       mrg   { return __builtin_cproj(__z.__rep()); }
   2519  1.10       mrg 
   2520  1.10       mrg   inline complex<long double>
   2521  1.10       mrg   __complex_proj(const complex<long double>& __z)
   2522  1.10       mrg   { return __builtin_cprojl(__z.__rep()); }
   2523  1.15       mrg 
   2524  1.15       mrg #if __cplusplus > 202002L
   2525  1.15       mrg #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   2526  1.15       mrg   inline __complex__ _Float16
   2527  1.15       mrg   __complex_proj(__complex__ _Float16 __z)
   2528  1.15       mrg   { return static_cast<__complex__ _Float16>(__builtin_cprojf(__z)); }
   2529  1.15       mrg #endif
   2530  1.15       mrg 
   2531  1.15       mrg #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   2532  1.15       mrg   inline __complex__ _Float32
   2533  1.15       mrg   __complex_proj(__complex__ _Float32 __z)
   2534  1.15       mrg   { return __builtin_cprojf(__z); }
   2535  1.15       mrg #endif
   2536  1.15       mrg 
   2537  1.15       mrg #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
   2538  1.15       mrg   inline __complex__ _Float64
   2539  1.15       mrg   __complex_proj(__complex__ _Float64 __z)
   2540  1.15       mrg   { return __builtin_cproj(__z); }
   2541  1.15       mrg #endif
   2542  1.15       mrg 
   2543  1.15       mrg #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
   2544  1.15       mrg   inline __complex__ _Float128
   2545  1.15       mrg   __complex_proj(__complex__ _Float128 __z)
   2546  1.15       mrg   { return __builtin_cprojl(__z); }
   2547  1.15       mrg #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
   2548  1.15       mrg   inline __complex__ _Float128
   2549  1.15       mrg   __complex_proj(__complex__ _Float128 __z)
   2550  1.15       mrg   { return __builtin_cprojf128(__z); }
   2551  1.15       mrg #endif
   2552  1.15       mrg 
   2553  1.15       mrg #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
   2554  1.15       mrg   inline __complex__ decltype(0.0bf16)
   2555  1.15       mrg   __complex_proj(__complex__ decltype(0.0bf16) __z)
   2556  1.15       mrg   { return static_cast<__complex__ decltype(0.0bf16)>(__builtin_cprojf(__z)); }
   2557  1.15       mrg #endif
   2558  1.15       mrg 
   2559  1.15       mrg   template<typename _Tp>
   2560  1.15       mrg     requires requires { typename __complex_type<_Tp>::type; }
   2561  1.15       mrg     inline complex<_Tp>
   2562  1.15       mrg     __complex_proj(const complex<_Tp>& __z)
   2563  1.15       mrg     { return __complex_proj(__z.__rep()); }
   2564  1.15       mrg #endif
   2565  1.15       mrg 
   2566  1.15       mrg #elif defined _GLIBCXX_USE_C99_MATH_FUNCS
   2567  1.10       mrg   inline complex<float>
   2568  1.10       mrg   __complex_proj(const complex<float>& __z)
   2569  1.10       mrg   {
   2570  1.10       mrg     if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
   2571  1.10       mrg       return complex<float>(__builtin_inff(),
   2572  1.10       mrg 			    __builtin_copysignf(0.0f, __z.imag()));
   2573  1.10       mrg     return __z;
   2574  1.10       mrg   }
   2575  1.10       mrg 
   2576  1.10       mrg   inline complex<double>
   2577  1.10       mrg   __complex_proj(const complex<double>& __z)
   2578  1.10       mrg   {
   2579  1.10       mrg     if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
   2580  1.10       mrg       return complex<double>(__builtin_inf(),
   2581  1.10       mrg 			     __builtin_copysign(0.0, __z.imag()));
   2582  1.10       mrg     return __z;
   2583  1.10       mrg   }
   2584  1.10       mrg 
   2585  1.10       mrg   inline complex<long double>
   2586  1.10       mrg   __complex_proj(const complex<long double>& __z)
   2587  1.10       mrg   {
   2588  1.10       mrg     if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
   2589  1.10       mrg       return complex<long double>(__builtin_infl(),
   2590  1.10       mrg 				  __builtin_copysignl(0.0l, __z.imag()));
   2591  1.10       mrg     return __z;
   2592  1.10       mrg   }
   2593  1.10       mrg #endif
   2594   1.1       mrg 
   2595   1.1       mrg   template<typename _Tp>
   2596   1.1       mrg     inline std::complex<_Tp>
   2597   1.1       mrg     proj(const std::complex<_Tp>& __z)
   2598   1.1       mrg     { return __complex_proj(__z); }
   2599   1.1       mrg 
   2600  1.10       mrg   // Overload for scalars
   2601   1.1       mrg   template<typename _Tp>
   2602   1.8       mrg     inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
   2603   1.1       mrg     proj(_Tp __x)
   2604   1.8       mrg     {
   2605   1.8       mrg       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   2606   1.8       mrg       return std::proj(std::complex<__type>(__x));
   2607   1.8       mrg     }
   2608   1.1       mrg 
   2609   1.1       mrg   template<typename _Tp>
   2610  1.10       mrg     inline _GLIBCXX20_CONSTEXPR
   2611  1.10       mrg 	std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
   2612   1.1       mrg     conj(_Tp __x)
   2613   1.8       mrg     {
   2614   1.8       mrg       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
   2615   1.8       mrg       return std::complex<__type>(__x, -__type());
   2616   1.8       mrg     }
   2617   1.1       mrg 
   2618  1.15       mrg #ifdef __cpp_lib_complex_udls // C++ >= 14
   2619   1.4       mrg 
   2620   1.4       mrg inline namespace literals {
   2621   1.4       mrg inline namespace complex_literals {
   2622   1.9       mrg #pragma GCC diagnostic push
   2623   1.9       mrg #pragma GCC diagnostic ignored "-Wliteral-suffix"
   2624   1.4       mrg 
   2625   1.4       mrg   constexpr std::complex<float>
   2626   1.4       mrg   operator""if(long double __num)
   2627   1.4       mrg   { return std::complex<float>{0.0F, static_cast<float>(__num)}; }
   2628   1.4       mrg 
   2629   1.4       mrg   constexpr std::complex<float>
   2630   1.4       mrg   operator""if(unsigned long long __num)
   2631   1.4       mrg   { return std::complex<float>{0.0F, static_cast<float>(__num)}; }
   2632   1.4       mrg 
   2633   1.4       mrg   constexpr std::complex<double>
   2634   1.4       mrg   operator""i(long double __num)
   2635   1.4       mrg   { return std::complex<double>{0.0, static_cast<double>(__num)}; }
   2636   1.4       mrg 
   2637   1.4       mrg   constexpr std::complex<double>
   2638   1.4       mrg   operator""i(unsigned long long __num)
   2639   1.4       mrg   { return std::complex<double>{0.0, static_cast<double>(__num)}; }
   2640   1.4       mrg 
   2641   1.4       mrg   constexpr std::complex<long double>
   2642   1.4       mrg   operator""il(long double __num)
   2643   1.4       mrg   { return std::complex<long double>{0.0L, __num}; }
   2644   1.4       mrg 
   2645   1.4       mrg   constexpr std::complex<long double>
   2646   1.4       mrg   operator""il(unsigned long long __num)
   2647   1.4       mrg   { return std::complex<long double>{0.0L, static_cast<long double>(__num)}; }
   2648   1.4       mrg 
   2649   1.9       mrg #pragma GCC diagnostic pop
   2650   1.4       mrg } // inline namespace complex_literals
   2651   1.4       mrg } // inline namespace literals
   2652   1.4       mrg 
   2653  1.15       mrg #endif // __cpp_lib_complex_udls
   2654   1.4       mrg 
   2655   1.9       mrg _GLIBCXX_END_NAMESPACE_VERSION
   2656   1.2  christos } // namespace
   2657   1.1       mrg 
   2658   1.2  christos #endif  // C++11
   2659   1.1       mrg 
   2660  1.15       mrg #ifdef __clang__
   2661  1.15       mrg #pragma clang diagnostic pop
   2662  1.15       mrg #endif
   2663  1.15       mrg 
   2664   1.2  christos #endif  /* _GLIBCXX_COMPLEX */
   2665