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