Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===--------------------------- complex ----------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_COMPLEX
     12 #define _LIBCPP_COMPLEX
     13 
     14 /*
     15     complex synopsis
     16 
     17 namespace std
     18 {
     19 
     20 template<class T>
     21 class complex
     22 {
     23 public:
     24     typedef T value_type;
     25 
     26     complex(const T& re = T(), const T& im = T()); // constexpr in C++14
     27     complex(const complex&);  // constexpr in C++14
     28     template<class X> complex(const complex<X>&);  // constexpr in C++14
     29 
     30     T real() const; // constexpr in C++14
     31     T imag() const; // constexpr in C++14
     32 
     33     void real(T);
     34     void imag(T);
     35 
     36     complex<T>& operator= (const T&);
     37     complex<T>& operator+=(const T&);
     38     complex<T>& operator-=(const T&);
     39     complex<T>& operator*=(const T&);
     40     complex<T>& operator/=(const T&);
     41 
     42     complex& operator=(const complex&);
     43     template<class X> complex<T>& operator= (const complex<X>&);
     44     template<class X> complex<T>& operator+=(const complex<X>&);
     45     template<class X> complex<T>& operator-=(const complex<X>&);
     46     template<class X> complex<T>& operator*=(const complex<X>&);
     47     template<class X> complex<T>& operator/=(const complex<X>&);
     48 };
     49 
     50 template<>
     51 class complex<float>
     52 {
     53 public:
     54     typedef float value_type;
     55 
     56     constexpr complex(float re = 0.0f, float im = 0.0f);
     57     explicit constexpr complex(const complex<double>&);
     58     explicit constexpr complex(const complex<long double>&);
     59 
     60     constexpr float real() const;
     61     void real(float);
     62     constexpr float imag() const;
     63     void imag(float);
     64 
     65     complex<float>& operator= (float);
     66     complex<float>& operator+=(float);
     67     complex<float>& operator-=(float);
     68     complex<float>& operator*=(float);
     69     complex<float>& operator/=(float);
     70 
     71     complex<float>& operator=(const complex<float>&);
     72     template<class X> complex<float>& operator= (const complex<X>&);
     73     template<class X> complex<float>& operator+=(const complex<X>&);
     74     template<class X> complex<float>& operator-=(const complex<X>&);
     75     template<class X> complex<float>& operator*=(const complex<X>&);
     76     template<class X> complex<float>& operator/=(const complex<X>&);
     77 };
     78 
     79 template<>
     80 class complex<double>
     81 {
     82 public:
     83     typedef double value_type;
     84 
     85     constexpr complex(double re = 0.0, double im = 0.0);
     86     constexpr complex(const complex<float>&);
     87     explicit constexpr complex(const complex<long double>&);
     88 
     89     constexpr double real() const;
     90     void real(double);
     91     constexpr double imag() const;
     92     void imag(double);
     93 
     94     complex<double>& operator= (double);
     95     complex<double>& operator+=(double);
     96     complex<double>& operator-=(double);
     97     complex<double>& operator*=(double);
     98     complex<double>& operator/=(double);
     99     complex<double>& operator=(const complex<double>&);
    100 
    101     template<class X> complex<double>& operator= (const complex<X>&);
    102     template<class X> complex<double>& operator+=(const complex<X>&);
    103     template<class X> complex<double>& operator-=(const complex<X>&);
    104     template<class X> complex<double>& operator*=(const complex<X>&);
    105     template<class X> complex<double>& operator/=(const complex<X>&);
    106 };
    107 
    108 template<>
    109 class complex<long double>
    110 {
    111 public:
    112     typedef long double value_type;
    113 
    114     constexpr complex(long double re = 0.0L, long double im = 0.0L);
    115     constexpr complex(const complex<float>&);
    116     constexpr complex(const complex<double>&);
    117 
    118     constexpr long double real() const;
    119     void real(long double);
    120     constexpr long double imag() const;
    121     void imag(long double);
    122 
    123     complex<long double>& operator=(const complex<long double>&);
    124     complex<long double>& operator= (long double);
    125     complex<long double>& operator+=(long double);
    126     complex<long double>& operator-=(long double);
    127     complex<long double>& operator*=(long double);
    128     complex<long double>& operator/=(long double);
    129 
    130     template<class X> complex<long double>& operator= (const complex<X>&);
    131     template<class X> complex<long double>& operator+=(const complex<X>&);
    132     template<class X> complex<long double>& operator-=(const complex<X>&);
    133     template<class X> complex<long double>& operator*=(const complex<X>&);
    134     template<class X> complex<long double>& operator/=(const complex<X>&);
    135 };
    136 
    137 // 26.3.6 operators:
    138 template<class T> complex<T> operator+(const complex<T>&, const complex<T>&);
    139 template<class T> complex<T> operator+(const complex<T>&, const T&);
    140 template<class T> complex<T> operator+(const T&, const complex<T>&);
    141 template<class T> complex<T> operator-(const complex<T>&, const complex<T>&);
    142 template<class T> complex<T> operator-(const complex<T>&, const T&);
    143 template<class T> complex<T> operator-(const T&, const complex<T>&);
    144 template<class T> complex<T> operator*(const complex<T>&, const complex<T>&);
    145 template<class T> complex<T> operator*(const complex<T>&, const T&);
    146 template<class T> complex<T> operator*(const T&, const complex<T>&);
    147 template<class T> complex<T> operator/(const complex<T>&, const complex<T>&);
    148 template<class T> complex<T> operator/(const complex<T>&, const T&);
    149 template<class T> complex<T> operator/(const T&, const complex<T>&);
    150 template<class T> complex<T> operator+(const complex<T>&);
    151 template<class T> complex<T> operator-(const complex<T>&);
    152 template<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14
    153 template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14
    154 template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14
    155 template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14
    156 template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14
    157 template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14
    158 
    159 template<class T, class charT, class traits>
    160   basic_istream<charT, traits>&
    161   operator>>(basic_istream<charT, traits>&, complex<T>&);
    162 template<class T, class charT, class traits>
    163   basic_ostream<charT, traits>&
    164   operator<<(basic_ostream<charT, traits>&, const complex<T>&);
    165 
    166 // 26.3.7 values:
    167 
    168 template<class T>              T real(const complex<T>&); // constexpr in C++14
    169                      long double real(long double);       // constexpr in C++14
    170                           double real(double);            // constexpr in C++14
    171 template<Integral T>      double real(T);                 // constexpr in C++14
    172                           float  real(float);             // constexpr in C++14
    173 
    174 template<class T>              T imag(const complex<T>&); // constexpr in C++14
    175                      long double imag(long double);       // constexpr in C++14
    176                           double imag(double);            // constexpr in C++14
    177 template<Integral T>      double imag(T);                 // constexpr in C++14
    178                           float  imag(float);             // constexpr in C++14
    179 
    180 template<class T> T abs(const complex<T>&);
    181 
    182 template<class T>              T arg(const complex<T>&);
    183                      long double arg(long double);
    184                           double arg(double);
    185 template<Integral T>      double arg(T);
    186                           float  arg(float);
    187 
    188 template<class T>              T norm(const complex<T>&);
    189                      long double norm(long double);
    190                           double norm(double);
    191 template<Integral T>      double norm(T);
    192                           float  norm(float);
    193 
    194 template<class T>      complex<T>           conj(const complex<T>&);
    195                        complex<long double> conj(long double);
    196                        complex<double>      conj(double);
    197 template<Integral T>   complex<double>      conj(T);
    198                        complex<float>       conj(float);
    199 
    200 template<class T>    complex<T>           proj(const complex<T>&);
    201                      complex<long double> proj(long double);
    202                      complex<double>      proj(double);
    203 template<Integral T> complex<double>      proj(T);
    204                      complex<float>       proj(float);
    205 
    206 template<class T> complex<T> polar(const T&, const T& = 0);
    207 
    208 // 26.3.8 transcendentals:
    209 template<class T> complex<T> acos(const complex<T>&);
    210 template<class T> complex<T> asin(const complex<T>&);
    211 template<class T> complex<T> atan(const complex<T>&);
    212 template<class T> complex<T> acosh(const complex<T>&);
    213 template<class T> complex<T> asinh(const complex<T>&);
    214 template<class T> complex<T> atanh(const complex<T>&);
    215 template<class T> complex<T> cos (const complex<T>&);
    216 template<class T> complex<T> cosh (const complex<T>&);
    217 template<class T> complex<T> exp (const complex<T>&);
    218 template<class T> complex<T> log (const complex<T>&);
    219 template<class T> complex<T> log10(const complex<T>&);
    220 
    221 template<class T> complex<T> pow(const complex<T>&, const T&);
    222 template<class T> complex<T> pow(const complex<T>&, const complex<T>&);
    223 template<class T> complex<T> pow(const T&, const complex<T>&);
    224 
    225 template<class T> complex<T> sin (const complex<T>&);
    226 template<class T> complex<T> sinh (const complex<T>&);
    227 template<class T> complex<T> sqrt (const complex<T>&);
    228 template<class T> complex<T> tan (const complex<T>&);
    229 template<class T> complex<T> tanh (const complex<T>&);
    230 
    231 template<class T, class charT, class traits>
    232   basic_istream<charT, traits>&
    233   operator>>(basic_istream<charT, traits>& is, complex<T>& x);
    234 
    235 template<class T, class charT, class traits>
    236   basic_ostream<charT, traits>&
    237   operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
    238 
    239 }  // std
    240 
    241 */
    242 
    243 #include <__config>
    244 #include <type_traits>
    245 #include <stdexcept>
    246 #include <cmath>
    247 #include <sstream>
    248 #if defined(_LIBCPP_NO_EXCEPTIONS)
    249     #include <cassert>
    250 #endif
    251 
    252 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    253 #pragma GCC system_header
    254 #endif
    255 
    256 _LIBCPP_BEGIN_NAMESPACE_STD
    257 
    258 template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY complex;
    259 
    260 template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w);
    261 template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y);
    262 
    263 template<class _Tp>
    264 class _LIBCPP_TYPE_VIS_ONLY complex
    265 {
    266 public:
    267     typedef _Tp value_type;
    268 private:
    269     value_type __re_;
    270     value_type __im_;
    271 public:
    272     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    273     complex(const value_type& __re = value_type(), const value_type& __im = value_type())
    274         : __re_(__re), __im_(__im) {}
    275     template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    276     complex(const complex<_Xp>& __c)
    277         : __re_(__c.real()), __im_(__c.imag()) {}
    278 
    279     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;}
    280     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;}
    281 
    282     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
    283     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
    284 
    285     _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re)
    286         {__re_ = __re; __im_ = value_type(); return *this;}
    287     _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;}
    288     _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;}
    289     _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;}
    290     _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;}
    291 
    292     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
    293         {
    294             __re_ = __c.real();
    295             __im_ = __c.imag();
    296             return *this;
    297         }
    298     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
    299         {
    300             __re_ += __c.real();
    301             __im_ += __c.imag();
    302             return *this;
    303         }
    304     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
    305         {
    306             __re_ -= __c.real();
    307             __im_ -= __c.imag();
    308             return *this;
    309         }
    310     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
    311         {
    312             *this = *this * complex(__c.real(), __c.imag());
    313             return *this;
    314         }
    315     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
    316         {
    317             *this = *this / complex(__c.real(), __c.imag());
    318             return *this;
    319         }
    320 };
    321 
    322 template<> class _LIBCPP_TYPE_VIS_ONLY complex<double>;
    323 template<> class _LIBCPP_TYPE_VIS_ONLY complex<long double>;
    324 
    325 template<>
    326 class _LIBCPP_TYPE_VIS_ONLY complex<float>
    327 {
    328     float __re_;
    329     float __im_;
    330 public:
    331     typedef float value_type;
    332 
    333     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f)
    334         : __re_(__re), __im_(__im) {}
    335     _LIBCPP_INLINE_VISIBILITY
    336     explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
    337     _LIBCPP_INLINE_VISIBILITY
    338     explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
    339 
    340     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;}
    341     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;}
    342 
    343     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
    344     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
    345 
    346     _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re)
    347         {__re_ = __re; __im_ = value_type(); return *this;}
    348     _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;}
    349     _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;}
    350     _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;}
    351     _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;}
    352 
    353     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
    354         {
    355             __re_ = __c.real();
    356             __im_ = __c.imag();
    357             return *this;
    358         }
    359     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
    360         {
    361             __re_ += __c.real();
    362             __im_ += __c.imag();
    363             return *this;
    364         }
    365     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
    366         {
    367             __re_ -= __c.real();
    368             __im_ -= __c.imag();
    369             return *this;
    370         }
    371     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
    372         {
    373             *this = *this * complex(__c.real(), __c.imag());
    374             return *this;
    375         }
    376     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
    377         {
    378             *this = *this / complex(__c.real(), __c.imag());
    379             return *this;
    380         }
    381 };
    382 
    383 template<>
    384 class _LIBCPP_TYPE_VIS_ONLY complex<double>
    385 {
    386     double __re_;
    387     double __im_;
    388 public:
    389     typedef double value_type;
    390 
    391     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0)
    392         : __re_(__re), __im_(__im) {}
    393     _LIBCPP_INLINE_VISIBILITY
    394     _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
    395     _LIBCPP_INLINE_VISIBILITY
    396     explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
    397 
    398     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;}
    399     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;}
    400 
    401     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
    402     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
    403 
    404     _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re)
    405         {__re_ = __re; __im_ = value_type(); return *this;}
    406     _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;}
    407     _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;}
    408     _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;}
    409     _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;}
    410 
    411     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
    412         {
    413             __re_ = __c.real();
    414             __im_ = __c.imag();
    415             return *this;
    416         }
    417     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
    418         {
    419             __re_ += __c.real();
    420             __im_ += __c.imag();
    421             return *this;
    422         }
    423     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
    424         {
    425             __re_ -= __c.real();
    426             __im_ -= __c.imag();
    427             return *this;
    428         }
    429     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
    430         {
    431             *this = *this * complex(__c.real(), __c.imag());
    432             return *this;
    433         }
    434     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
    435         {
    436             *this = *this / complex(__c.real(), __c.imag());
    437             return *this;
    438         }
    439 };
    440 
    441 template<>
    442 class _LIBCPP_TYPE_VIS_ONLY complex<long double>
    443 {
    444     long double __re_;
    445     long double __im_;
    446 public:
    447     typedef long double value_type;
    448 
    449     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L)
    450         : __re_(__re), __im_(__im) {}
    451     _LIBCPP_INLINE_VISIBILITY
    452     _LIBCPP_CONSTEXPR complex(const complex<float>& __c);
    453     _LIBCPP_INLINE_VISIBILITY
    454     _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
    455 
    456     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;}
    457     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;}
    458 
    459     _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
    460     _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
    461 
    462     _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re)
    463         {__re_ = __re; __im_ = value_type(); return *this;}
    464     _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;}
    465     _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;}
    466     _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;}
    467     _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;}
    468 
    469     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
    470         {
    471             __re_ = __c.real();
    472             __im_ = __c.imag();
    473             return *this;
    474         }
    475     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
    476         {
    477             __re_ += __c.real();
    478             __im_ += __c.imag();
    479             return *this;
    480         }
    481     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
    482         {
    483             __re_ -= __c.real();
    484             __im_ -= __c.imag();
    485             return *this;
    486         }
    487     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
    488         {
    489             *this = *this * complex(__c.real(), __c.imag());
    490             return *this;
    491         }
    492     template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
    493         {
    494             *this = *this / complex(__c.real(), __c.imag());
    495             return *this;
    496         }
    497 };
    498 
    499 inline
    500 _LIBCPP_CONSTEXPR
    501 complex<float>::complex(const complex<double>& __c)
    502     : __re_(__c.real()), __im_(__c.imag()) {}
    503 
    504 inline
    505 _LIBCPP_CONSTEXPR
    506 complex<float>::complex(const complex<long double>& __c)
    507     : __re_(__c.real()), __im_(__c.imag()) {}
    508 
    509 inline
    510 _LIBCPP_CONSTEXPR
    511 complex<double>::complex(const complex<float>& __c)
    512     : __re_(__c.real()), __im_(__c.imag()) {}
    513 
    514 inline
    515 _LIBCPP_CONSTEXPR
    516 complex<double>::complex(const complex<long double>& __c)
    517     : __re_(__c.real()), __im_(__c.imag()) {}
    518 
    519 inline
    520 _LIBCPP_CONSTEXPR
    521 complex<long double>::complex(const complex<float>& __c)
    522     : __re_(__c.real()), __im_(__c.imag()) {}
    523 
    524 inline
    525 _LIBCPP_CONSTEXPR
    526 complex<long double>::complex(const complex<double>& __c)
    527     : __re_(__c.real()), __im_(__c.imag()) {}
    528 
    529 // 26.3.6 operators:
    530 
    531 template<class _Tp>
    532 inline _LIBCPP_INLINE_VISIBILITY
    533 complex<_Tp>
    534 operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
    535 {
    536     complex<_Tp> __t(__x);
    537     __t += __y;
    538     return __t;
    539 }
    540 
    541 template<class _Tp>
    542 inline _LIBCPP_INLINE_VISIBILITY
    543 complex<_Tp>
    544 operator+(const complex<_Tp>& __x, const _Tp& __y)
    545 {
    546     complex<_Tp> __t(__x);
    547     __t += __y;
    548     return __t;
    549 }
    550 
    551 template<class _Tp>
    552 inline _LIBCPP_INLINE_VISIBILITY
    553 complex<_Tp>
    554 operator+(const _Tp& __x, const complex<_Tp>& __y)
    555 {
    556     complex<_Tp> __t(__y);
    557     __t += __x;
    558     return __t;
    559 }
    560 
    561 template<class _Tp>
    562 inline _LIBCPP_INLINE_VISIBILITY
    563 complex<_Tp>
    564 operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
    565 {
    566     complex<_Tp> __t(__x);
    567     __t -= __y;
    568     return __t;
    569 }
    570 
    571 template<class _Tp>
    572 inline _LIBCPP_INLINE_VISIBILITY
    573 complex<_Tp>
    574 operator-(const complex<_Tp>& __x, const _Tp& __y)
    575 {
    576     complex<_Tp> __t(__x);
    577     __t -= __y;
    578     return __t;
    579 }
    580 
    581 template<class _Tp>
    582 inline _LIBCPP_INLINE_VISIBILITY
    583 complex<_Tp>
    584 operator-(const _Tp& __x, const complex<_Tp>& __y)
    585 {
    586     complex<_Tp> __t(-__y);
    587     __t += __x;
    588     return __t;
    589 }
    590 
    591 template<class _Tp>
    592 complex<_Tp>
    593 operator*(const complex<_Tp>& __z, const complex<_Tp>& __w)
    594 {
    595     _Tp __a = __z.real();
    596     _Tp __b = __z.imag();
    597     _Tp __c = __w.real();
    598     _Tp __d = __w.imag();
    599     _Tp __ac = __a * __c;
    600     _Tp __bd = __b * __d;
    601     _Tp __ad = __a * __d;
    602     _Tp __bc = __b * __c;
    603     _Tp __x = __ac - __bd;
    604     _Tp __y = __ad + __bc;
    605     if (isnan(__x) && isnan(__y))
    606     {
    607         bool __recalc = false;
    608         if (isinf(__a) || isinf(__b))
    609         {
    610             __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
    611             __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
    612             if (isnan(__c))
    613                 __c = copysign(_Tp(0), __c);
    614             if (isnan(__d))
    615                 __d = copysign(_Tp(0), __d);
    616             __recalc = true;
    617         }
    618         if (isinf(__c) || isinf(__d))
    619         {
    620             __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
    621             __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
    622             if (isnan(__a))
    623                 __a = copysign(_Tp(0), __a);
    624             if (isnan(__b))
    625                 __b = copysign(_Tp(0), __b);
    626             __recalc = true;
    627         }
    628         if (!__recalc && (isinf(__ac) || isinf(__bd) ||
    629                           isinf(__ad) || isinf(__bc)))
    630         {
    631             if (isnan(__a))
    632                 __a = copysign(_Tp(0), __a);
    633             if (isnan(__b))
    634                 __b = copysign(_Tp(0), __b);
    635             if (isnan(__c))
    636                 __c = copysign(_Tp(0), __c);
    637             if (isnan(__d))
    638                 __d = copysign(_Tp(0), __d);
    639             __recalc = true;
    640         }
    641         if (__recalc)
    642         {
    643             __x = _Tp(INFINITY) * (__a * __c - __b * __d);
    644             __y = _Tp(INFINITY) * (__a * __d + __b * __c);
    645         }
    646     }
    647     return complex<_Tp>(__x, __y);
    648 }
    649 
    650 template<class _Tp>
    651 inline _LIBCPP_INLINE_VISIBILITY
    652 complex<_Tp>
    653 operator*(const complex<_Tp>& __x, const _Tp& __y)
    654 {
    655     complex<_Tp> __t(__x);
    656     __t *= __y;
    657     return __t;
    658 }
    659 
    660 template<class _Tp>
    661 inline _LIBCPP_INLINE_VISIBILITY
    662 complex<_Tp>
    663 operator*(const _Tp& __x, const complex<_Tp>& __y)
    664 {
    665     complex<_Tp> __t(__y);
    666     __t *= __x;
    667     return __t;
    668 }
    669 
    670 template<class _Tp>
    671 complex<_Tp>
    672 operator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
    673 {
    674     int __ilogbw = 0;
    675     _Tp __a = __z.real();
    676     _Tp __b = __z.imag();
    677     _Tp __c = __w.real();
    678     _Tp __d = __w.imag();
    679     _Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
    680     if (isfinite(__logbw))
    681     {
    682         __ilogbw = static_cast<int>(__logbw);
    683         __c = scalbn(__c, -__ilogbw);
    684         __d = scalbn(__d, -__ilogbw);
    685     }
    686     _Tp __denom = __c * __c + __d * __d;
    687     _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
    688     _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
    689     if (isnan(__x) && isnan(__y))
    690     {
    691         if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b)))
    692         {
    693             __x = copysign(_Tp(INFINITY), __c) * __a;
    694             __y = copysign(_Tp(INFINITY), __c) * __b;
    695         }
    696         else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d))
    697         {
    698             __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
    699             __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
    700             __x = _Tp(INFINITY) * (__a * __c + __b * __d);
    701             __y = _Tp(INFINITY) * (__b * __c - __a * __d);
    702         }
    703         else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && isfinite(__b))
    704         {
    705             __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
    706             __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
    707             __x = _Tp(0) * (__a * __c + __b * __d);
    708             __y = _Tp(0) * (__b * __c - __a * __d);
    709         }
    710     }
    711     return complex<_Tp>(__x, __y);
    712 }
    713 
    714 template<class _Tp>
    715 inline _LIBCPP_INLINE_VISIBILITY
    716 complex<_Tp>
    717 operator/(const complex<_Tp>& __x, const _Tp& __y)
    718 {
    719     return complex<_Tp>(__x.real() / __y, __x.imag() / __y);
    720 }
    721 
    722 template<class _Tp>
    723 inline _LIBCPP_INLINE_VISIBILITY
    724 complex<_Tp>
    725 operator/(const _Tp& __x, const complex<_Tp>& __y)
    726 {
    727     complex<_Tp> __t(__x);
    728     __t /= __y;
    729     return __t;
    730 }
    731 
    732 template<class _Tp>
    733 inline _LIBCPP_INLINE_VISIBILITY
    734 complex<_Tp>
    735 operator+(const complex<_Tp>& __x)
    736 {
    737     return __x;
    738 }
    739 
    740 template<class _Tp>
    741 inline _LIBCPP_INLINE_VISIBILITY
    742 complex<_Tp>
    743 operator-(const complex<_Tp>& __x)
    744 {
    745     return complex<_Tp>(-__x.real(), -__x.imag());
    746 }
    747 
    748 template<class _Tp>
    749 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    750 bool
    751 operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
    752 {
    753     return __x.real() == __y.real() && __x.imag() == __y.imag();
    754 }
    755 
    756 template<class _Tp>
    757 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    758 bool
    759 operator==(const complex<_Tp>& __x, const _Tp& __y)
    760 {
    761     return __x.real() == __y && __x.imag() == 0;
    762 }
    763 
    764 template<class _Tp>
    765 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    766 bool
    767 operator==(const _Tp& __x, const complex<_Tp>& __y)
    768 {
    769     return __x == __y.real() && 0 == __y.imag();
    770 }
    771 
    772 template<class _Tp>
    773 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    774 bool
    775 operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
    776 {
    777     return !(__x == __y);
    778 }
    779 
    780 template<class _Tp>
    781 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    782 bool
    783 operator!=(const complex<_Tp>& __x, const _Tp& __y)
    784 {
    785     return !(__x == __y);
    786 }
    787 
    788 template<class _Tp>
    789 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    790 bool
    791 operator!=(const _Tp& __x, const complex<_Tp>& __y)
    792 {
    793     return !(__x == __y);
    794 }
    795 
    796 // 26.3.7 values:
    797 
    798 // real
    799 
    800 template<class _Tp>
    801 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    802 _Tp
    803 real(const complex<_Tp>& __c)
    804 {
    805     return __c.real();
    806 }
    807 
    808 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    809 long double
    810 real(long double __re)
    811 {
    812     return __re;
    813 }
    814 
    815 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    816 double
    817 real(double __re)
    818 {
    819     return __re;
    820 }
    821 
    822 template<class _Tp>
    823 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    824 typename enable_if
    825 <
    826     is_integral<_Tp>::value,
    827     double
    828 >::type
    829 real(_Tp  __re)
    830 {
    831     return __re;
    832 }
    833 
    834 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    835 float
    836 real(float  __re)
    837 {
    838     return __re;
    839 }
    840 
    841 // imag
    842 
    843 template<class _Tp>
    844 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    845 _Tp
    846 imag(const complex<_Tp>& __c)
    847 {
    848     return __c.imag();
    849 }
    850 
    851 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    852 long double
    853 imag(long double __re)
    854 {
    855     return 0;
    856 }
    857 
    858 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    859 double
    860 imag(double __re)
    861 {
    862     return 0;
    863 }
    864 
    865 template<class _Tp>
    866 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    867 typename enable_if
    868 <
    869     is_integral<_Tp>::value,
    870     double
    871 >::type
    872 imag(_Tp  __re)
    873 {
    874     return 0;
    875 }
    876 
    877 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
    878 float
    879 imag(float  __re)
    880 {
    881     return 0;
    882 }
    883 
    884 // abs
    885 
    886 template<class _Tp>
    887 inline _LIBCPP_INLINE_VISIBILITY
    888 _Tp
    889 abs(const complex<_Tp>& __c)
    890 {
    891     return hypot(__c.real(), __c.imag());
    892 }
    893 
    894 // arg
    895 
    896 template<class _Tp>
    897 inline _LIBCPP_INLINE_VISIBILITY
    898 _Tp
    899 arg(const complex<_Tp>& __c)
    900 {
    901     return atan2(__c.imag(), __c.real());
    902 }
    903 
    904 inline _LIBCPP_INLINE_VISIBILITY
    905 long double
    906 arg(long double __re)
    907 {
    908     return atan2l(0.L, __re);
    909 }
    910 
    911 inline _LIBCPP_INLINE_VISIBILITY
    912 double
    913 arg(double __re)
    914 {
    915     return atan2(0., __re);
    916 }
    917 
    918 template<class _Tp>
    919 inline _LIBCPP_INLINE_VISIBILITY
    920 typename enable_if
    921 <
    922     is_integral<_Tp>::value,
    923     double
    924 >::type
    925 arg(_Tp __re)
    926 {
    927     return atan2(0., __re);
    928 }
    929 
    930 inline _LIBCPP_INLINE_VISIBILITY
    931 float
    932 arg(float __re)
    933 {
    934     return atan2f(0.F, __re);
    935 }
    936 
    937 // norm
    938 
    939 template<class _Tp>
    940 inline _LIBCPP_INLINE_VISIBILITY
    941 _Tp
    942 norm(const complex<_Tp>& __c)
    943 {
    944     if (isinf(__c.real()))
    945         return abs(__c.real());
    946     if (isinf(__c.imag()))
    947         return abs(__c.imag());
    948     return __c.real() * __c.real() + __c.imag() * __c.imag();
    949 }
    950 
    951 inline _LIBCPP_INLINE_VISIBILITY
    952 long double
    953 norm(long double __re)
    954 {
    955     return __re * __re;
    956 }
    957 
    958 inline _LIBCPP_INLINE_VISIBILITY
    959 double
    960 norm(double __re)
    961 {
    962     return __re * __re;
    963 }
    964 
    965 template<class _Tp>
    966 inline _LIBCPP_INLINE_VISIBILITY
    967 typename enable_if
    968 <
    969     is_integral<_Tp>::value,
    970     double
    971 >::type
    972 norm(_Tp __re)
    973 {
    974     return (double)__re * __re;
    975 }
    976 
    977 inline _LIBCPP_INLINE_VISIBILITY
    978 float
    979 norm(float __re)
    980 {
    981     return __re * __re;
    982 }
    983 
    984 // conj
    985 
    986 template<class _Tp>
    987 inline _LIBCPP_INLINE_VISIBILITY
    988 complex<_Tp>
    989 conj(const complex<_Tp>& __c)
    990 {
    991     return complex<_Tp>(__c.real(), -__c.imag());
    992 }
    993 
    994 inline _LIBCPP_INLINE_VISIBILITY
    995 complex<long double>
    996 conj(long double __re)
    997 {
    998     return complex<long double>(__re);
    999 }
   1000 
   1001 inline _LIBCPP_INLINE_VISIBILITY
   1002 complex<double>
   1003 conj(double __re)
   1004 {
   1005     return complex<double>(__re);
   1006 }
   1007 
   1008 template<class _Tp>
   1009 inline _LIBCPP_INLINE_VISIBILITY
   1010 typename enable_if
   1011 <
   1012     is_integral<_Tp>::value,
   1013     complex<double>
   1014 >::type
   1015 conj(_Tp __re)
   1016 {
   1017     return complex<double>(__re);
   1018 }
   1019 
   1020 inline _LIBCPP_INLINE_VISIBILITY
   1021 complex<float>
   1022 conj(float __re)
   1023 {
   1024     return complex<float>(__re);
   1025 }
   1026 
   1027 // proj
   1028 
   1029 template<class _Tp>
   1030 inline _LIBCPP_INLINE_VISIBILITY
   1031 complex<_Tp>
   1032 proj(const complex<_Tp>& __c)
   1033 {
   1034     std::complex<_Tp> __r = __c;
   1035     if (isinf(__c.real()) || isinf(__c.imag()))
   1036         __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag()));
   1037     return __r;
   1038 }
   1039 
   1040 inline _LIBCPP_INLINE_VISIBILITY
   1041 complex<long double>
   1042 proj(long double __re)
   1043 {
   1044     if (isinf(__re))
   1045         __re = abs(__re);
   1046     return complex<long double>(__re);
   1047 }
   1048 
   1049 inline _LIBCPP_INLINE_VISIBILITY
   1050 complex<double>
   1051 proj(double __re)
   1052 {
   1053     if (isinf(__re))
   1054         __re = abs(__re);
   1055     return complex<double>(__re);
   1056 }
   1057 
   1058 template<class _Tp>
   1059 inline _LIBCPP_INLINE_VISIBILITY
   1060 typename enable_if
   1061 <
   1062     is_integral<_Tp>::value,
   1063     complex<double>
   1064 >::type
   1065 proj(_Tp __re)
   1066 {
   1067     return complex<double>(__re);
   1068 }
   1069 
   1070 inline _LIBCPP_INLINE_VISIBILITY
   1071 complex<float>
   1072 proj(float __re)
   1073 {
   1074     if (isinf(__re))
   1075         __re = abs(__re);
   1076     return complex<float>(__re);
   1077 }
   1078 
   1079 // polar
   1080 
   1081 template<class _Tp>
   1082 complex<_Tp>
   1083 polar(const _Tp& __rho, const _Tp& __theta = _Tp(0))
   1084 {
   1085     if (isnan(__rho) || signbit(__rho))
   1086         return complex<_Tp>(_Tp(NAN), _Tp(NAN));
   1087     if (isnan(__theta))
   1088     {
   1089         if (isinf(__rho))
   1090             return complex<_Tp>(__rho, __theta);
   1091         return complex<_Tp>(__theta, __theta);
   1092     }
   1093     if (isinf(__theta))
   1094     {
   1095         if (isinf(__rho))
   1096             return complex<_Tp>(__rho, _Tp(NAN));
   1097         return complex<_Tp>(_Tp(NAN), _Tp(NAN));
   1098     }
   1099     _Tp __x = __rho * cos(__theta);
   1100     if (isnan(__x))
   1101         __x = 0;
   1102     _Tp __y = __rho * sin(__theta);
   1103     if (isnan(__y))
   1104         __y = 0;
   1105     return complex<_Tp>(__x, __y);
   1106 }
   1107 
   1108 // log
   1109 
   1110 template<class _Tp>
   1111 inline _LIBCPP_INLINE_VISIBILITY
   1112 complex<_Tp>
   1113 log(const complex<_Tp>& __x)
   1114 {
   1115     return complex<_Tp>(log(abs(__x)), arg(__x));
   1116 }
   1117 
   1118 // log10
   1119 
   1120 template<class _Tp>
   1121 inline _LIBCPP_INLINE_VISIBILITY
   1122 complex<_Tp>
   1123 log10(const complex<_Tp>& __x)
   1124 {
   1125     return log(__x) / log(_Tp(10));
   1126 }
   1127 
   1128 // sqrt
   1129 
   1130 template<class _Tp>
   1131 complex<_Tp>
   1132 sqrt(const complex<_Tp>& __x)
   1133 {
   1134     if (isinf(__x.imag()))
   1135         return complex<_Tp>(_Tp(INFINITY), __x.imag());
   1136     if (isinf(__x.real()))
   1137     {
   1138         if (__x.real() > _Tp(0))
   1139             return complex<_Tp>(__x.real(), isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
   1140         return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
   1141     }
   1142     return polar(sqrt(abs(__x)), arg(__x) / _Tp(2));
   1143 }
   1144 
   1145 // exp
   1146 
   1147 template<class _Tp>
   1148 complex<_Tp>
   1149 exp(const complex<_Tp>& __x)
   1150 {
   1151     _Tp __i = __x.imag();
   1152     if (isinf(__x.real()))
   1153     {
   1154         if (__x.real() < _Tp(0))
   1155         {
   1156             if (!isfinite(__i))
   1157                 __i = _Tp(1);
   1158         }
   1159         else if (__i == 0 || !isfinite(__i))
   1160         {
   1161             if (isinf(__i))
   1162                 __i = _Tp(NAN);
   1163             return complex<_Tp>(__x.real(), __i);
   1164         }
   1165     }
   1166     else if (isnan(__x.real()) && __x.imag() == 0)
   1167         return __x;
   1168     _Tp __e = exp(__x.real());
   1169     return complex<_Tp>(__e * cos(__i), __e * sin(__i));
   1170 }
   1171 
   1172 // pow
   1173 
   1174 template<class _Tp>
   1175 inline _LIBCPP_INLINE_VISIBILITY
   1176 complex<_Tp>
   1177 pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
   1178 {
   1179     return exp(__y * log(__x));
   1180 }
   1181 
   1182 template<class _Tp, class _Up>
   1183 inline _LIBCPP_INLINE_VISIBILITY
   1184 complex<typename __promote<_Tp, _Up>::type>
   1185 pow(const complex<_Tp>& __x, const complex<_Up>& __y)
   1186 {
   1187     typedef complex<typename __promote<_Tp, _Up>::type> result_type;
   1188     return _VSTD::pow(result_type(__x), result_type(__y));
   1189 }
   1190 
   1191 template<class _Tp, class _Up>
   1192 inline _LIBCPP_INLINE_VISIBILITY
   1193 typename enable_if
   1194 <
   1195     is_arithmetic<_Up>::value,
   1196     complex<typename __promote<_Tp, _Up>::type>
   1197 >::type
   1198 pow(const complex<_Tp>& __x, const _Up& __y)
   1199 {
   1200     typedef complex<typename __promote<_Tp, _Up>::type> result_type;
   1201     return _VSTD::pow(result_type(__x), result_type(__y));
   1202 }
   1203 
   1204 template<class _Tp, class _Up>
   1205 inline _LIBCPP_INLINE_VISIBILITY
   1206 typename enable_if
   1207 <
   1208     is_arithmetic<_Tp>::value,
   1209     complex<typename __promote<_Tp, _Up>::type>
   1210 >::type
   1211 pow(const _Tp& __x, const complex<_Up>& __y)
   1212 {
   1213     typedef complex<typename __promote<_Tp, _Up>::type> result_type;
   1214     return _VSTD::pow(result_type(__x), result_type(__y));
   1215 }
   1216 
   1217 // asinh
   1218 
   1219 template<class _Tp>
   1220 complex<_Tp>
   1221 asinh(const complex<_Tp>& __x)
   1222 {
   1223     const _Tp __pi(atan2(+0., -0.));
   1224     if (isinf(__x.real()))
   1225     {
   1226         if (isnan(__x.imag()))
   1227             return __x;
   1228         if (isinf(__x.imag()))
   1229             return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
   1230         return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
   1231     }
   1232     if (isnan(__x.real()))
   1233     {
   1234         if (isinf(__x.imag()))
   1235             return complex<_Tp>(__x.imag(), __x.real());
   1236         if (__x.imag() == 0)
   1237             return __x;
   1238         return complex<_Tp>(__x.real(), __x.real());
   1239     }
   1240     if (isinf(__x.imag()))
   1241         return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
   1242     complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1)));
   1243     return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
   1244 }
   1245 
   1246 // acosh
   1247 
   1248 template<class _Tp>
   1249 complex<_Tp>
   1250 acosh(const complex<_Tp>& __x)
   1251 {
   1252     const _Tp __pi(atan2(+0., -0.));
   1253     if (isinf(__x.real()))
   1254     {
   1255         if (isnan(__x.imag()))
   1256             return complex<_Tp>(abs(__x.real()), __x.imag());
   1257         if (isinf(__x.imag()))
   1258         {
   1259             if (__x.real() > 0)
   1260                 return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
   1261             else
   1262                 return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag()));
   1263         }
   1264         if (__x.real() < 0)
   1265             return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag()));
   1266         return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
   1267     }
   1268     if (isnan(__x.real()))
   1269     {
   1270         if (isinf(__x.imag()))
   1271             return complex<_Tp>(abs(__x.imag()), __x.real());
   1272         return complex<_Tp>(__x.real(), __x.real());
   1273     }
   1274     if (isinf(__x.imag()))
   1275         return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag()));
   1276     complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
   1277     return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag()));
   1278 }
   1279 
   1280 // atanh
   1281 
   1282 template<class _Tp>
   1283 complex<_Tp>
   1284 atanh(const complex<_Tp>& __x)
   1285 {
   1286     const _Tp __pi(atan2(+0., -0.));
   1287     if (isinf(__x.imag()))
   1288     {
   1289         return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
   1290     }
   1291     if (isnan(__x.imag()))
   1292     {
   1293         if (isinf(__x.real()) || __x.real() == 0)
   1294             return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag());
   1295         return complex<_Tp>(__x.imag(), __x.imag());
   1296     }
   1297     if (isnan(__x.real()))
   1298     {
   1299         return complex<_Tp>(__x.real(), __x.real());
   1300     }
   1301     if (isinf(__x.real()))
   1302     {
   1303         return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
   1304     }
   1305     if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0))
   1306     {
   1307         return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag()));
   1308     }
   1309     complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2);
   1310     return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
   1311 }
   1312 
   1313 // sinh
   1314 
   1315 template<class _Tp>
   1316 complex<_Tp>
   1317 sinh(const complex<_Tp>& __x)
   1318 {
   1319     if (isinf(__x.real()) && !isfinite(__x.imag()))
   1320         return complex<_Tp>(__x.real(), _Tp(NAN));
   1321     if (__x.real() == 0 && !isfinite(__x.imag()))
   1322         return complex<_Tp>(__x.real(), _Tp(NAN));
   1323     if (__x.imag() == 0 && !isfinite(__x.real()))
   1324         return __x;
   1325     return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag()));
   1326 }
   1327 
   1328 // cosh
   1329 
   1330 template<class _Tp>
   1331 complex<_Tp>
   1332 cosh(const complex<_Tp>& __x)
   1333 {
   1334     if (isinf(__x.real()) && !isfinite(__x.imag()))
   1335         return complex<_Tp>(abs(__x.real()), _Tp(NAN));
   1336     if (__x.real() == 0 && !isfinite(__x.imag()))
   1337         return complex<_Tp>(_Tp(NAN), __x.real());
   1338     if (__x.real() == 0 && __x.imag() == 0)
   1339         return complex<_Tp>(_Tp(1), __x.imag());
   1340     if (__x.imag() == 0 && !isfinite(__x.real()))
   1341         return complex<_Tp>(abs(__x.real()), __x.imag());
   1342     return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag()));
   1343 }
   1344 
   1345 // tanh
   1346 
   1347 template<class _Tp>
   1348 complex<_Tp>
   1349 tanh(const complex<_Tp>& __x)
   1350 {
   1351     if (isinf(__x.real()))
   1352     {
   1353         if (!isfinite(__x.imag()))
   1354             return complex<_Tp>(_Tp(1), _Tp(0));
   1355         return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag())));
   1356     }
   1357     if (isnan(__x.real()) && __x.imag() == 0)
   1358         return __x;
   1359     _Tp __2r(_Tp(2) * __x.real());
   1360     _Tp __2i(_Tp(2) * __x.imag());
   1361     _Tp __d(cosh(__2r) + cos(__2i));
   1362     _Tp __2rsh(sinh(__2r));
   1363     if (isinf(__2rsh) && isinf(__d))
   1364         return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1),
   1365                             __2i > _Tp(0) ? _Tp(0) : _Tp(-0.));
   1366     return  complex<_Tp>(__2rsh/__d, sin(__2i)/__d);
   1367 }
   1368 
   1369 // asin
   1370 
   1371 template<class _Tp>
   1372 complex<_Tp>
   1373 asin(const complex<_Tp>& __x)
   1374 {
   1375     complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real()));
   1376     return complex<_Tp>(__z.imag(), -__z.real());
   1377 }
   1378 
   1379 // acos
   1380 
   1381 template<class _Tp>
   1382 complex<_Tp>
   1383 acos(const complex<_Tp>& __x)
   1384 {
   1385     const _Tp __pi(atan2(+0., -0.));
   1386     if (isinf(__x.real()))
   1387     {
   1388         if (isnan(__x.imag()))
   1389             return complex<_Tp>(__x.imag(), __x.real());
   1390         if (isinf(__x.imag()))
   1391         {
   1392             if (__x.real() < _Tp(0))
   1393                 return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag());
   1394             return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag());
   1395         }
   1396         if (__x.real() < _Tp(0))
   1397             return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real());
   1398         return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real());
   1399     }
   1400     if (isnan(__x.real()))
   1401     {
   1402         if (isinf(__x.imag()))
   1403             return complex<_Tp>(__x.real(), -__x.imag());
   1404         return complex<_Tp>(__x.real(), __x.real());
   1405     }
   1406     if (isinf(__x.imag()))
   1407         return complex<_Tp>(__pi/_Tp(2), -__x.imag());
   1408     if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag())))
   1409         return complex<_Tp>(__pi/_Tp(2), -__x.imag());
   1410     complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
   1411     if (signbit(__x.imag()))
   1412         return complex<_Tp>(abs(__z.imag()), abs(__z.real()));
   1413     return complex<_Tp>(abs(__z.imag()), -abs(__z.real()));
   1414 }
   1415 
   1416 // atan
   1417 
   1418 template<class _Tp>
   1419 complex<_Tp>
   1420 atan(const complex<_Tp>& __x)
   1421 {
   1422     complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real()));
   1423     return complex<_Tp>(__z.imag(), -__z.real());
   1424 }
   1425 
   1426 // sin
   1427 
   1428 template<class _Tp>
   1429 complex<_Tp>
   1430 sin(const complex<_Tp>& __x)
   1431 {
   1432     complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real()));
   1433     return complex<_Tp>(__z.imag(), -__z.real());
   1434 }
   1435 
   1436 // cos
   1437 
   1438 template<class _Tp>
   1439 inline _LIBCPP_INLINE_VISIBILITY
   1440 complex<_Tp>
   1441 cos(const complex<_Tp>& __x)
   1442 {
   1443     return cosh(complex<_Tp>(-__x.imag(), __x.real()));
   1444 }
   1445 
   1446 // tan
   1447 
   1448 template<class _Tp>
   1449 complex<_Tp>
   1450 tan(const complex<_Tp>& __x)
   1451 {
   1452     complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real()));
   1453     return complex<_Tp>(__z.imag(), -__z.real());
   1454 }
   1455 
   1456 template<class _Tp, class _CharT, class _Traits>
   1457 basic_istream<_CharT, _Traits>&
   1458 operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
   1459 {
   1460     if (__is.good())
   1461     {
   1462         ws(__is);
   1463         if (__is.peek() == _CharT('('))
   1464         {
   1465             __is.get();
   1466             _Tp __r;
   1467             __is >> __r;
   1468             if (!__is.fail())
   1469             {
   1470                 ws(__is);
   1471                 _CharT __c = __is.peek();
   1472                 if (__c == _CharT(','))
   1473                 {
   1474                     __is.get();
   1475                     _Tp __i;
   1476                     __is >> __i;
   1477                     if (!__is.fail())
   1478                     {
   1479                         ws(__is);
   1480                         __c = __is.peek();
   1481                         if (__c == _CharT(')'))
   1482                         {
   1483                             __is.get();
   1484                             __x = complex<_Tp>(__r, __i);
   1485                         }
   1486                         else
   1487                             __is.setstate(ios_base::failbit);
   1488                     }
   1489                     else
   1490                         __is.setstate(ios_base::failbit);
   1491                 }
   1492                 else if (__c == _CharT(')'))
   1493                 {
   1494                     __is.get();
   1495                     __x = complex<_Tp>(__r, _Tp(0));
   1496                 }
   1497                 else
   1498                     __is.setstate(ios_base::failbit);
   1499             }
   1500             else
   1501                 __is.setstate(ios_base::failbit);
   1502         }
   1503         else
   1504         {
   1505             _Tp __r;
   1506             __is >> __r;
   1507             if (!__is.fail())
   1508                 __x = complex<_Tp>(__r, _Tp(0));
   1509             else
   1510                 __is.setstate(ios_base::failbit);
   1511         }
   1512     }
   1513     else
   1514         __is.setstate(ios_base::failbit);
   1515     return __is;
   1516 }
   1517 
   1518 template<class _Tp, class _CharT, class _Traits>
   1519 basic_ostream<_CharT, _Traits>&
   1520 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
   1521 {
   1522     basic_ostringstream<_CharT, _Traits> __s;
   1523     __s.flags(__os.flags());
   1524     __s.imbue(__os.getloc());
   1525     __s.precision(__os.precision());
   1526     __s << '(' << __x.real() << ',' << __x.imag() << ')';
   1527     return __os << __s.str();
   1528 }
   1529 
   1530 #if _LIBCPP_STD_VER > 11 
   1531 // Literal suffix for complex number literals [complex.literals]
   1532 inline namespace literals
   1533 { 
   1534   inline namespace complex_literals
   1535   {
   1536     constexpr complex<long double> operator""il(long double __im)
   1537     {
   1538         return { 0.0l, __im };
   1539     }
   1540 
   1541     constexpr complex<long double> operator""il(unsigned long long __im)
   1542     {
   1543         return { 0.0l, static_cast<long double>(__im) };
   1544     }
   1545 
   1546 
   1547     constexpr complex<double> operator""i(long double __im)
   1548     {
   1549         return { 0.0, static_cast<double>(__im) };
   1550     }
   1551 
   1552     constexpr complex<double> operator""i(unsigned long long __im)
   1553     {
   1554         return { 0.0, static_cast<double>(__im) };
   1555     }
   1556 
   1557 
   1558     constexpr complex<float> operator""if(long double __im)
   1559     {
   1560         return { 0.0f, static_cast<float>(__im) };
   1561     }
   1562 
   1563     constexpr complex<float> operator""if(unsigned long long __im)
   1564     {
   1565         return { 0.0f, static_cast<float>(__im) };
   1566     }
   1567   }
   1568 }
   1569 #endif
   1570 
   1571 _LIBCPP_END_NAMESPACE_STD
   1572 
   1573 #endif  // _LIBCPP_COMPLEX
   1574