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