13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===--------------------------- complex ----------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6*412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7*412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_COMPLEX
123e519524SHoward Hinnant#define _LIBCPP_COMPLEX
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    complex synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate<class T>
213e519524SHoward Hinnantclass complex
223e519524SHoward Hinnant{
233e519524SHoward Hinnantpublic:
243e519524SHoward Hinnant    typedef T value_type;
253e519524SHoward Hinnant
263e519524SHoward Hinnant    complex(const T& re = T(), const T& im = T());
273e519524SHoward Hinnant    complex(const complex&);
283e519524SHoward Hinnant    template<class X> complex(const complex<X>&);
293e519524SHoward Hinnant
303e519524SHoward Hinnant    T real() const;
313e519524SHoward Hinnant    T imag() const;
323e519524SHoward Hinnant
333e519524SHoward Hinnant    void real(T);
343e519524SHoward Hinnant    void imag(T);
353e519524SHoward Hinnant
363e519524SHoward Hinnant    complex<T>& operator= (const T&);
373e519524SHoward Hinnant    complex<T>& operator+=(const T&);
383e519524SHoward Hinnant    complex<T>& operator-=(const T&);
393e519524SHoward Hinnant    complex<T>& operator*=(const T&);
403e519524SHoward Hinnant    complex<T>& operator/=(const T&);
413e519524SHoward Hinnant
423e519524SHoward Hinnant    complex& operator=(const complex&);
433e519524SHoward Hinnant    template<class X> complex<T>& operator= (const complex<X>&);
443e519524SHoward Hinnant    template<class X> complex<T>& operator+=(const complex<X>&);
453e519524SHoward Hinnant    template<class X> complex<T>& operator-=(const complex<X>&);
463e519524SHoward Hinnant    template<class X> complex<T>& operator*=(const complex<X>&);
473e519524SHoward Hinnant    template<class X> complex<T>& operator/=(const complex<X>&);
483e519524SHoward Hinnant};
493e519524SHoward Hinnant
503e519524SHoward Hinnanttemplate<>
513e519524SHoward Hinnantclass complex<float>
523e519524SHoward Hinnant{
533e519524SHoward Hinnantpublic:
543e519524SHoward Hinnant    typedef float value_type;
553e519524SHoward Hinnant
563e519524SHoward Hinnant    constexpr complex(float re = 0.0f, float im = 0.0f);
573e519524SHoward Hinnant    explicit constexpr complex(const complex<double>&);
583e519524SHoward Hinnant    explicit constexpr complex(const complex<long double>&);
593e519524SHoward Hinnant
603e519524SHoward Hinnant    constexpr float real() const;
613e519524SHoward Hinnant    void real(float);
623e519524SHoward Hinnant    constexpr float imag() const;
633e519524SHoward Hinnant    void imag(float);
643e519524SHoward Hinnant
653e519524SHoward Hinnant    complex<float>& operator= (float);
663e519524SHoward Hinnant    complex<float>& operator+=(float);
673e519524SHoward Hinnant    complex<float>& operator-=(float);
683e519524SHoward Hinnant    complex<float>& operator*=(float);
693e519524SHoward Hinnant    complex<float>& operator/=(float);
703e519524SHoward Hinnant
713e519524SHoward Hinnant    complex<float>& operator=(const complex<float>&);
723e519524SHoward Hinnant    template<class X> complex<float>& operator= (const complex<X>&);
733e519524SHoward Hinnant    template<class X> complex<float>& operator+=(const complex<X>&);
743e519524SHoward Hinnant    template<class X> complex<float>& operator-=(const complex<X>&);
753e519524SHoward Hinnant    template<class X> complex<float>& operator*=(const complex<X>&);
763e519524SHoward Hinnant    template<class X> complex<float>& operator/=(const complex<X>&);
773e519524SHoward Hinnant};
783e519524SHoward Hinnant
793e519524SHoward Hinnanttemplate<>
803e519524SHoward Hinnantclass complex<double>
813e519524SHoward Hinnant{
823e519524SHoward Hinnantpublic:
833e519524SHoward Hinnant    typedef double value_type;
843e519524SHoward Hinnant
853e519524SHoward Hinnant    constexpr complex(double re = 0.0, double im = 0.0);
863e519524SHoward Hinnant    constexpr complex(const complex<float>&);
873e519524SHoward Hinnant    explicit constexpr complex(const complex<long double>&);
883e519524SHoward Hinnant
893e519524SHoward Hinnant    constexpr double real() const;
903e519524SHoward Hinnant    void real(double);
913e519524SHoward Hinnant    constexpr double imag() const;
923e519524SHoward Hinnant    void imag(double);
933e519524SHoward Hinnant
943e519524SHoward Hinnant    complex<double>& operator= (double);
953e519524SHoward Hinnant    complex<double>& operator+=(double);
963e519524SHoward Hinnant    complex<double>& operator-=(double);
973e519524SHoward Hinnant    complex<double>& operator*=(double);
983e519524SHoward Hinnant    complex<double>& operator/=(double);
993e519524SHoward Hinnant    complex<double>& operator=(const complex<double>&);
1003e519524SHoward Hinnant
1013e519524SHoward Hinnant    template<class X> complex<double>& operator= (const complex<X>&);
1023e519524SHoward Hinnant    template<class X> complex<double>& operator+=(const complex<X>&);
1033e519524SHoward Hinnant    template<class X> complex<double>& operator-=(const complex<X>&);
1043e519524SHoward Hinnant    template<class X> complex<double>& operator*=(const complex<X>&);
1053e519524SHoward Hinnant    template<class X> complex<double>& operator/=(const complex<X>&);
1063e519524SHoward Hinnant};
1073e519524SHoward Hinnant
1083e519524SHoward Hinnanttemplate<>
1093e519524SHoward Hinnantclass complex<long double>
1103e519524SHoward Hinnant{
1113e519524SHoward Hinnantpublic:
1123e519524SHoward Hinnant    typedef long double value_type;
1133e519524SHoward Hinnant
1143e519524SHoward Hinnant    constexpr complex(long double re = 0.0L, long double im = 0.0L);
1153e519524SHoward Hinnant    constexpr complex(const complex<float>&);
1163e519524SHoward Hinnant    constexpr complex(const complex<double>&);
1173e519524SHoward Hinnant
1183e519524SHoward Hinnant    constexpr long double real() const;
1193e519524SHoward Hinnant    void real(long double);
1203e519524SHoward Hinnant    constexpr long double imag() const;
1213e519524SHoward Hinnant    void imag(long double);
1223e519524SHoward Hinnant
1233e519524SHoward Hinnant    complex<long double>& operator=(const complex<long double>&);
1243e519524SHoward Hinnant    complex<long double>& operator= (long double);
1253e519524SHoward Hinnant    complex<long double>& operator+=(long double);
1263e519524SHoward Hinnant    complex<long double>& operator-=(long double);
1273e519524SHoward Hinnant    complex<long double>& operator*=(long double);
1283e519524SHoward Hinnant    complex<long double>& operator/=(long double);
1293e519524SHoward Hinnant
1303e519524SHoward Hinnant    template<class X> complex<long double>& operator= (const complex<X>&);
1313e519524SHoward Hinnant    template<class X> complex<long double>& operator+=(const complex<X>&);
1323e519524SHoward Hinnant    template<class X> complex<long double>& operator-=(const complex<X>&);
1333e519524SHoward Hinnant    template<class X> complex<long double>& operator*=(const complex<X>&);
1343e519524SHoward Hinnant    template<class X> complex<long double>& operator/=(const complex<X>&);
1353e519524SHoward Hinnant};
1363e519524SHoward Hinnant
1373e519524SHoward Hinnant// 26.3.6 operators:
1383e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const complex<T>&, const complex<T>&);
1393e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const complex<T>&, const T&);
1403e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const T&, const complex<T>&);
1413e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const complex<T>&, const complex<T>&);
1423e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const complex<T>&, const T&);
1433e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const T&, const complex<T>&);
1443e519524SHoward Hinnanttemplate<class T> complex<T> operator*(const complex<T>&, const complex<T>&);
1453e519524SHoward Hinnanttemplate<class T> complex<T> operator*(const complex<T>&, const T&);
1463e519524SHoward Hinnanttemplate<class T> complex<T> operator*(const T&, const complex<T>&);
1473e519524SHoward Hinnanttemplate<class T> complex<T> operator/(const complex<T>&, const complex<T>&);
1483e519524SHoward Hinnanttemplate<class T> complex<T> operator/(const complex<T>&, const T&);
1493e519524SHoward Hinnanttemplate<class T> complex<T> operator/(const T&, const complex<T>&);
1503e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const complex<T>&);
1513e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const complex<T>&);
1523e519524SHoward Hinnanttemplate<class T> bool operator==(const complex<T>&, const complex<T>&);
1533e519524SHoward Hinnanttemplate<class T> bool operator==(const complex<T>&, const T&);
1543e519524SHoward Hinnanttemplate<class T> bool operator==(const T&, const complex<T>&);
1553e519524SHoward Hinnanttemplate<class T> bool operator!=(const complex<T>&, const complex<T>&);
1563e519524SHoward Hinnanttemplate<class T> bool operator!=(const complex<T>&, const T&);
1573e519524SHoward Hinnanttemplate<class T> bool operator!=(const T&, const complex<T>&);
1583e519524SHoward Hinnant
1593e519524SHoward Hinnanttemplate<class T, class charT, class traits>
1603e519524SHoward Hinnant  basic_istream<charT, traits>&
1613e519524SHoward Hinnant  operator>>(basic_istream<charT, traits>&, complex<T>&);
1623e519524SHoward Hinnanttemplate<class T, class charT, class traits>
1633e519524SHoward Hinnant  basic_ostream<charT, traits>&
1643e519524SHoward Hinnant  operator<<(basic_ostream<charT, traits>&, const complex<T>&);
1653e519524SHoward Hinnant
1663e519524SHoward Hinnant// 26.3.7 values:
1673e519524SHoward Hinnant
1683e519524SHoward Hinnanttemplate<class T>              T real(const complex<T>&);
1693e519524SHoward Hinnant                     long double real(long double);
1703e519524SHoward Hinnant                          double real(double);
1713e519524SHoward Hinnanttemplate<Integral T>      double real(T);
1723e519524SHoward Hinnant                          float  real(float);
1733e519524SHoward Hinnant
1743e519524SHoward Hinnanttemplate<class T>              T imag(const complex<T>&);
1753e519524SHoward Hinnant                     long double imag(long double);
1763e519524SHoward Hinnant                          double imag(double);
1773e519524SHoward Hinnanttemplate<Integral T>      double imag(T);
1783e519524SHoward Hinnant                          float  imag(float);
1793e519524SHoward Hinnant
1803e519524SHoward Hinnanttemplate<class T> T abs(const complex<T>&);
1813e519524SHoward Hinnant
1823e519524SHoward Hinnanttemplate<class T>              T arg(const complex<T>&);
1833e519524SHoward Hinnant                     long double arg(long double);
1843e519524SHoward Hinnant                          double arg(double);
1853e519524SHoward Hinnanttemplate<Integral T>      double arg(T);
1863e519524SHoward Hinnant                          float  arg(float);
1873e519524SHoward Hinnant
1883e519524SHoward Hinnanttemplate<class T>              T norm(const complex<T>&);
1893e519524SHoward Hinnant                     long double norm(long double);
1903e519524SHoward Hinnant                          double norm(double);
1913e519524SHoward Hinnanttemplate<Integral T>      double norm(T);
1923e519524SHoward Hinnant                          float  norm(float);
1933e519524SHoward Hinnant
1943e519524SHoward Hinnanttemplate<class T>      complex<T>  conj(const complex<T>&);
1953e519524SHoward Hinnant                       long double conj(long double);
1963e519524SHoward Hinnant                       double      conj(double);
1973e519524SHoward Hinnanttemplate<Integral T>   double      conj(T);
1983e519524SHoward Hinnant                       float       conj(float);
1993e519524SHoward Hinnant
2003e519524SHoward Hinnanttemplate<class T>    complex<T>  proj(const complex<T>&);
2013e519524SHoward Hinnant                     long double proj(long double);
2023e519524SHoward Hinnant                     double      proj(double);
2033e519524SHoward Hinnanttemplate<Integral T> double      proj(T);
2043e519524SHoward Hinnant                     float       proj(float);
2053e519524SHoward Hinnant
2063e519524SHoward Hinnanttemplate<class T> complex<T> polar(const T&, const T& = 0);
2073e519524SHoward Hinnant
2083e519524SHoward Hinnant// 26.3.8 transcendentals:
2093e519524SHoward Hinnanttemplate<class T> complex<T> acos(const complex<T>&);
2103e519524SHoward Hinnanttemplate<class T> complex<T> asin(const complex<T>&);
2113e519524SHoward Hinnanttemplate<class T> complex<T> atan(const complex<T>&);
2123e519524SHoward Hinnanttemplate<class T> complex<T> acosh(const complex<T>&);
2133e519524SHoward Hinnanttemplate<class T> complex<T> asinh(const complex<T>&);
2143e519524SHoward Hinnanttemplate<class T> complex<T> atanh(const complex<T>&);
2153e519524SHoward Hinnanttemplate<class T> complex<T> cos (const complex<T>&);
2163e519524SHoward Hinnanttemplate<class T> complex<T> cosh (const complex<T>&);
2173e519524SHoward Hinnanttemplate<class T> complex<T> exp (const complex<T>&);
2183e519524SHoward Hinnanttemplate<class T> complex<T> log (const complex<T>&);
2193e519524SHoward Hinnanttemplate<class T> complex<T> log10(const complex<T>&);
2203e519524SHoward Hinnant
2213e519524SHoward Hinnanttemplate<class T> complex<T> pow(const complex<T>&, const T&);
2223e519524SHoward Hinnanttemplate<class T> complex<T> pow(const complex<T>&, const complex<T>&);
2233e519524SHoward Hinnanttemplate<class T> complex<T> pow(const T&, const complex<T>&);
2243e519524SHoward Hinnant
2253e519524SHoward Hinnanttemplate<class T> complex<T> sin (const complex<T>&);
2263e519524SHoward Hinnanttemplate<class T> complex<T> sinh (const complex<T>&);
2273e519524SHoward Hinnanttemplate<class T> complex<T> sqrt (const complex<T>&);
2283e519524SHoward Hinnanttemplate<class T> complex<T> tan (const complex<T>&);
2293e519524SHoward Hinnanttemplate<class T> complex<T> tanh (const complex<T>&);
2303e519524SHoward Hinnant
2313e519524SHoward Hinnanttemplate<class T, class charT, class traits>
2323e519524SHoward Hinnant  basic_istream<charT, traits>&
2333e519524SHoward Hinnant  operator>>(basic_istream<charT, traits>& is, complex<T>& x);
2343e519524SHoward Hinnant
2353e519524SHoward Hinnanttemplate<class T, class charT, class traits>
2363e519524SHoward Hinnant  basic_ostream<charT, traits>&
2373e519524SHoward Hinnant  operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
2383e519524SHoward Hinnant
2393e519524SHoward Hinnant}  // std
2403e519524SHoward Hinnant
2413e519524SHoward Hinnant*/
2423e519524SHoward Hinnant
2433e519524SHoward Hinnant#include <__config>
2443e519524SHoward Hinnant#include <type_traits>
2453e519524SHoward Hinnant#include <stdexcept>
2463e519524SHoward Hinnant#include <cmath>
2473e519524SHoward Hinnant#include <sstream>
2483e519524SHoward Hinnant#if defined(_LIBCPP_NO_EXCEPTIONS)
2493e519524SHoward Hinnant    #include <cassert>
2503e519524SHoward Hinnant#endif
2513e519524SHoward Hinnant
2523e519524SHoward Hinnant#pragma GCC system_header
2533e519524SHoward Hinnant
2543e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
2553e519524SHoward Hinnant
256fb100021SHoward Hinnanttemplate<class _Tp> class _LIBCPP_VISIBLE complex;
2573e519524SHoward Hinnant
2583e519524SHoward Hinnanttemplate<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w);
2593e519524SHoward Hinnanttemplate<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y);
2603e519524SHoward Hinnant
2613e519524SHoward Hinnanttemplate<class _Tp>
262fb100021SHoward Hinnantclass _LIBCPP_VISIBLE complex
2633e519524SHoward Hinnant{
2643e519524SHoward Hinnantpublic:
2653e519524SHoward Hinnant    typedef _Tp value_type;
2663e519524SHoward Hinnantprivate:
2673e519524SHoward Hinnant    value_type __re_;
2683e519524SHoward Hinnant    value_type __im_;
2693e519524SHoward Hinnantpublic:
2703e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2713e519524SHoward Hinnant    complex(const value_type& __re = value_type(), const value_type& __im = value_type())
2723e519524SHoward Hinnant        : __re_(__re), __im_(__im) {}
2733e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY
2743e519524SHoward Hinnant    complex(const complex<_Xp>& __c)
2753e519524SHoward Hinnant        : __re_(__c.real()), __im_(__c.imag()) {}
2763e519524SHoward Hinnant
2773e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY value_type real() const {return __re_;}
2783e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY value_type imag() const {return __im_;}
2793e519524SHoward Hinnant
2803e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
2813e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
2823e519524SHoward Hinnant
2833e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) {__re_ = __re; return *this;}
2843e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;}
2853e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;}
2863e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;}
2873e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;}
2883e519524SHoward Hinnant
2893e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
2903e519524SHoward Hinnant        {
2913e519524SHoward Hinnant            __re_ = __c.real();
2923e519524SHoward Hinnant            __im_ = __c.imag();
2933e519524SHoward Hinnant            return *this;
2943e519524SHoward Hinnant        }
2953e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
2963e519524SHoward Hinnant        {
2973e519524SHoward Hinnant            __re_ += __c.real();
2983e519524SHoward Hinnant            __im_ += __c.imag();
2993e519524SHoward Hinnant            return *this;
3003e519524SHoward Hinnant        }
3013e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
3023e519524SHoward Hinnant        {
3033e519524SHoward Hinnant            __re_ -= __c.real();
3043e519524SHoward Hinnant            __im_ -= __c.imag();
3053e519524SHoward Hinnant            return *this;
3063e519524SHoward Hinnant        }
3073e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
3083e519524SHoward Hinnant        {
3093e519524SHoward Hinnant            *this = *this * __c;
3103e519524SHoward Hinnant            return *this;
3113e519524SHoward Hinnant        }
3123e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
3133e519524SHoward Hinnant        {
3143e519524SHoward Hinnant            *this = *this / __c;
3153e519524SHoward Hinnant            return *this;
3163e519524SHoward Hinnant        }
3173e519524SHoward Hinnant};
3183e519524SHoward Hinnant
319fb100021SHoward Hinnanttemplate<> class _LIBCPP_VISIBLE complex<double>;
320fb100021SHoward Hinnanttemplate<> class _LIBCPP_VISIBLE complex<long double>;
3213e519524SHoward Hinnant
3223e519524SHoward Hinnanttemplate<>
323fb100021SHoward Hinnantclass _LIBCPP_VISIBLE complex<float>
3243e519524SHoward Hinnant{
3253e519524SHoward Hinnant    float __re_;
3263e519524SHoward Hinnant    float __im_;
3273e519524SHoward Hinnantpublic:
3283e519524SHoward Hinnant    typedef float value_type;
3293e519524SHoward Hinnant
3303e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY complex(float __re = 0.0f, float __im = 0.0f)
3313e519524SHoward Hinnant        : __re_(__re), __im_(__im) {}
3323e519524SHoward Hinnant    explicit /*constexpr*/ complex(const complex<double>& __c);
3333e519524SHoward Hinnant    explicit /*constexpr*/ complex(const complex<long double>& __c);
3343e519524SHoward Hinnant
3353e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY float real() const {return __re_;}
3363e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY float imag() const {return __im_;}
3373e519524SHoward Hinnant
3383e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
3393e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
3403e519524SHoward Hinnant
3413e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) {__re_ = __re; return *this;}
3423e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;}
3433e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;}
3443e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;}
3453e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;}
3463e519524SHoward Hinnant
3473e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
3483e519524SHoward Hinnant        {
3493e519524SHoward Hinnant            __re_ = __c.real();
3503e519524SHoward Hinnant            __im_ = __c.imag();
3513e519524SHoward Hinnant            return *this;
3523e519524SHoward Hinnant        }
3533e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
3543e519524SHoward Hinnant        {
3553e519524SHoward Hinnant            __re_ += __c.real();
3563e519524SHoward Hinnant            __im_ += __c.imag();
3573e519524SHoward Hinnant            return *this;
3583e519524SHoward Hinnant        }
3593e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
3603e519524SHoward Hinnant        {
3613e519524SHoward Hinnant            __re_ -= __c.real();
3623e519524SHoward Hinnant            __im_ -= __c.imag();
3633e519524SHoward Hinnant            return *this;
3643e519524SHoward Hinnant        }
3653e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
3663e519524SHoward Hinnant        {
3673e519524SHoward Hinnant            *this = *this * __c;
3683e519524SHoward Hinnant            return *this;
3693e519524SHoward Hinnant        }
3703e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
3713e519524SHoward Hinnant        {
3723e519524SHoward Hinnant            *this = *this / __c;
3733e519524SHoward Hinnant            return *this;
3743e519524SHoward Hinnant        }
3753e519524SHoward Hinnant};
3763e519524SHoward Hinnant
3773e519524SHoward Hinnanttemplate<>
378fb100021SHoward Hinnantclass _LIBCPP_VISIBLE complex<double>
3793e519524SHoward Hinnant{
3803e519524SHoward Hinnant    double __re_;
3813e519524SHoward Hinnant    double __im_;
3823e519524SHoward Hinnantpublic:
3833e519524SHoward Hinnant    typedef double value_type;
3843e519524SHoward Hinnant
3853e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY complex(double __re = 0.0, double __im = 0.0)
3863e519524SHoward Hinnant        : __re_(__re), __im_(__im) {}
3873e519524SHoward Hinnant    /*constexpr*/ complex(const complex<float>& __c);
3883e519524SHoward Hinnant    explicit /*constexpr*/ complex(const complex<long double>& __c);
3893e519524SHoward Hinnant
3903e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY double real() const {return __re_;}
3913e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY double imag() const {return __im_;}
3923e519524SHoward Hinnant
3933e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
3943e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
3953e519524SHoward Hinnant
3963e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) {__re_ = __re; return *this;}
3973e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;}
3983e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;}
3993e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;}
4003e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;}
4013e519524SHoward Hinnant
4023e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
4033e519524SHoward Hinnant        {
4043e519524SHoward Hinnant            __re_ = __c.real();
4053e519524SHoward Hinnant            __im_ = __c.imag();
4063e519524SHoward Hinnant            return *this;
4073e519524SHoward Hinnant        }
4083e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
4093e519524SHoward Hinnant        {
4103e519524SHoward Hinnant            __re_ += __c.real();
4113e519524SHoward Hinnant            __im_ += __c.imag();
4123e519524SHoward Hinnant            return *this;
4133e519524SHoward Hinnant        }
4143e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
4153e519524SHoward Hinnant        {
4163e519524SHoward Hinnant            __re_ -= __c.real();
4173e519524SHoward Hinnant            __im_ -= __c.imag();
4183e519524SHoward Hinnant            return *this;
4193e519524SHoward Hinnant        }
4203e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
4213e519524SHoward Hinnant        {
4223e519524SHoward Hinnant            *this = *this * __c;
4233e519524SHoward Hinnant            return *this;
4243e519524SHoward Hinnant        }
4253e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
4263e519524SHoward Hinnant        {
4273e519524SHoward Hinnant            *this = *this / __c;
4283e519524SHoward Hinnant            return *this;
4293e519524SHoward Hinnant        }
4303e519524SHoward Hinnant};
4313e519524SHoward Hinnant
4323e519524SHoward Hinnanttemplate<>
433fb100021SHoward Hinnantclass _LIBCPP_VISIBLE complex<long double>
4343e519524SHoward Hinnant{
4353e519524SHoward Hinnant    long double __re_;
4363e519524SHoward Hinnant    long double __im_;
4373e519524SHoward Hinnantpublic:
4383e519524SHoward Hinnant    typedef long double value_type;
4393e519524SHoward Hinnant
4403e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY complex(long double __re = 0.0L, long double __im = 0.0L)
4413e519524SHoward Hinnant        : __re_(__re), __im_(__im) {}
4423e519524SHoward Hinnant    /*constexpr*/ complex(const complex<float>& __c);
4433e519524SHoward Hinnant    /*constexpr*/ complex(const complex<double>& __c);
4443e519524SHoward Hinnant
4453e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY long double real() const {return __re_;}
4463e519524SHoward Hinnant    /*constexpr*/ _LIBCPP_INLINE_VISIBILITY long double imag() const {return __im_;}
4473e519524SHoward Hinnant
4483e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
4493e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
4503e519524SHoward Hinnant
4513e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) {__re_ = __re; return *this;}
4523e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;}
4533e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;}
4543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;}
4553e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;}
4563e519524SHoward Hinnant
4573e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c)
4583e519524SHoward Hinnant        {
4593e519524SHoward Hinnant            __re_ = __c.real();
4603e519524SHoward Hinnant            __im_ = __c.imag();
4613e519524SHoward Hinnant            return *this;
4623e519524SHoward Hinnant        }
4633e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c)
4643e519524SHoward Hinnant        {
4653e519524SHoward Hinnant            __re_ += __c.real();
4663e519524SHoward Hinnant            __im_ += __c.imag();
4673e519524SHoward Hinnant            return *this;
4683e519524SHoward Hinnant        }
4693e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c)
4703e519524SHoward Hinnant        {
4713e519524SHoward Hinnant            __re_ -= __c.real();
4723e519524SHoward Hinnant            __im_ -= __c.imag();
4733e519524SHoward Hinnant            return *this;
4743e519524SHoward Hinnant        }
4753e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
4763e519524SHoward Hinnant        {
4773e519524SHoward Hinnant            *this = *this * __c;
4783e519524SHoward Hinnant            return *this;
4793e519524SHoward Hinnant        }
4803e519524SHoward Hinnant    template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
4813e519524SHoward Hinnant        {
4823e519524SHoward Hinnant            *this = *this / __c;
4833e519524SHoward Hinnant            return *this;
4843e519524SHoward Hinnant        }
4853e519524SHoward Hinnant};
4863e519524SHoward Hinnant
4873e519524SHoward Hinnant//constexpr
4883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4893e519524SHoward Hinnantcomplex<float>::complex(const complex<double>& __c)
4903e519524SHoward Hinnant    : __re_(__c.real()), __im_(__c.imag()) {}
4913e519524SHoward Hinnant
4923e519524SHoward Hinnant//constexpr
4933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4943e519524SHoward Hinnantcomplex<float>::complex(const complex<long double>& __c)
4953e519524SHoward Hinnant    : __re_(__c.real()), __im_(__c.imag()) {}
4963e519524SHoward Hinnant
4973e519524SHoward Hinnant//constexpr
4983e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4993e519524SHoward Hinnantcomplex<double>::complex(const complex<float>& __c)
5003e519524SHoward Hinnant    : __re_(__c.real()), __im_(__c.imag()) {}
5013e519524SHoward Hinnant
5023e519524SHoward Hinnant//constexpr
5033e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5043e519524SHoward Hinnantcomplex<double>::complex(const complex<long double>& __c)
5053e519524SHoward Hinnant    : __re_(__c.real()), __im_(__c.imag()) {}
5063e519524SHoward Hinnant
5073e519524SHoward Hinnant//constexpr
5083e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5093e519524SHoward Hinnantcomplex<long double>::complex(const complex<float>& __c)
5103e519524SHoward Hinnant    : __re_(__c.real()), __im_(__c.imag()) {}
5113e519524SHoward Hinnant
5123e519524SHoward Hinnant//constexpr
5133e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5143e519524SHoward Hinnantcomplex<long double>::complex(const complex<double>& __c)
5153e519524SHoward Hinnant    : __re_(__c.real()), __im_(__c.imag()) {}
5163e519524SHoward Hinnant
5173e519524SHoward Hinnant// 26.3.6 operators:
5183e519524SHoward Hinnant
5193e519524SHoward Hinnanttemplate<class _Tp>
5203e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5213e519524SHoward Hinnantcomplex<_Tp>
5223e519524SHoward Hinnantoperator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
5233e519524SHoward Hinnant{
5243e519524SHoward Hinnant    complex<_Tp> __t(__x);
5253e519524SHoward Hinnant    __t += __y;
5263e519524SHoward Hinnant    return __t;
5273e519524SHoward Hinnant}
5283e519524SHoward Hinnant
5293e519524SHoward Hinnanttemplate<class _Tp>
5303e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5313e519524SHoward Hinnantcomplex<_Tp>
5323e519524SHoward Hinnantoperator+(const complex<_Tp>& __x, const _Tp& __y)
5333e519524SHoward Hinnant{
5343e519524SHoward Hinnant    complex<_Tp> __t(__x);
5353e519524SHoward Hinnant    __t += __y;
5363e519524SHoward Hinnant    return __t;
5373e519524SHoward Hinnant}
5383e519524SHoward Hinnant
5393e519524SHoward Hinnanttemplate<class _Tp>
5403e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5413e519524SHoward Hinnantcomplex<_Tp>
5423e519524SHoward Hinnantoperator+(const _Tp& __x, const complex<_Tp>& __y)
5433e519524SHoward Hinnant{
5443e519524SHoward Hinnant    complex<_Tp> __t(__y);
5453e519524SHoward Hinnant    __t += __x;
5463e519524SHoward Hinnant    return __t;
5473e519524SHoward Hinnant}
5483e519524SHoward Hinnant
5493e519524SHoward Hinnanttemplate<class _Tp>
5503e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5513e519524SHoward Hinnantcomplex<_Tp>
5523e519524SHoward Hinnantoperator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
5533e519524SHoward Hinnant{
5543e519524SHoward Hinnant    complex<_Tp> __t(__x);
5553e519524SHoward Hinnant    __t -= __y;
5563e519524SHoward Hinnant    return __t;
5573e519524SHoward Hinnant}
5583e519524SHoward Hinnant
5593e519524SHoward Hinnanttemplate<class _Tp>
5603e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5613e519524SHoward Hinnantcomplex<_Tp>
5623e519524SHoward Hinnantoperator-(const complex<_Tp>& __x, const _Tp& __y)
5633e519524SHoward Hinnant{
5643e519524SHoward Hinnant    complex<_Tp> __t(__x);
5653e519524SHoward Hinnant    __t -= __y;
5663e519524SHoward Hinnant    return __t;
5673e519524SHoward Hinnant}
5683e519524SHoward Hinnant
5693e519524SHoward Hinnanttemplate<class _Tp>
5703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5713e519524SHoward Hinnantcomplex<_Tp>
5723e519524SHoward Hinnantoperator-(const _Tp& __x, const complex<_Tp>& __y)
5733e519524SHoward Hinnant{
5743e519524SHoward Hinnant    complex<_Tp> __t(-__y);
5753e519524SHoward Hinnant    __t += __x;
5763e519524SHoward Hinnant    return __t;
5773e519524SHoward Hinnant}
5783e519524SHoward Hinnant
5793e519524SHoward Hinnanttemplate<class _Tp>
5803e519524SHoward Hinnantcomplex<_Tp>
5813e519524SHoward Hinnantoperator*(const complex<_Tp>& __z, const complex<_Tp>& __w)
5823e519524SHoward Hinnant{
5833e519524SHoward Hinnant    _Tp __a = __z.real();
5843e519524SHoward Hinnant    _Tp __b = __z.imag();
5853e519524SHoward Hinnant    _Tp __c = __w.real();
5863e519524SHoward Hinnant    _Tp __d = __w.imag();
5873e519524SHoward Hinnant    _Tp __ac = __a * __c;
5883e519524SHoward Hinnant    _Tp __bd = __b * __d;
5893e519524SHoward Hinnant    _Tp __ad = __a * __d;
5903e519524SHoward Hinnant    _Tp __bc = __b * __c;
5913e519524SHoward Hinnant    _Tp __x = __ac - __bd;
5923e519524SHoward Hinnant    _Tp __y = __ad + __bc;
5933e519524SHoward Hinnant    if (isnan(__x) && isnan(__y))
5943e519524SHoward Hinnant    {
5953e519524SHoward Hinnant        bool __recalc = false;
5963e519524SHoward Hinnant        if (isinf(__a) || isinf(__b))
5973e519524SHoward Hinnant        {
5983e519524SHoward Hinnant            __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
5993e519524SHoward Hinnant            __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
6003e519524SHoward Hinnant            if (isnan(__c))
6013e519524SHoward Hinnant                __c = copysign(_Tp(0), __c);
6023e519524SHoward Hinnant            if (isnan(__d))
6033e519524SHoward Hinnant                __d = copysign(_Tp(0), __d);
6043e519524SHoward Hinnant            __recalc = true;
6053e519524SHoward Hinnant        }
6063e519524SHoward Hinnant        if (isinf(__c) || isinf(__d))
6073e519524SHoward Hinnant        {
6083e519524SHoward Hinnant            __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
6093e519524SHoward Hinnant            __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
6103e519524SHoward Hinnant            if (isnan(__a))
6113e519524SHoward Hinnant                __a = copysign(_Tp(0), __a);
6123e519524SHoward Hinnant            if (isnan(__b))
6133e519524SHoward Hinnant                __b = copysign(_Tp(0), __b);
6143e519524SHoward Hinnant            __recalc = true;
6153e519524SHoward Hinnant        }
6163e519524SHoward Hinnant        if (!__recalc && (isinf(__ac) || isinf(__bd) ||
6173e519524SHoward Hinnant                          isinf(__ad) || isinf(__bc)))
6183e519524SHoward Hinnant        {
6193e519524SHoward Hinnant            if (isnan(__a))
6203e519524SHoward Hinnant                __a = copysign(_Tp(0), __a);
6213e519524SHoward Hinnant            if (isnan(__b))
6223e519524SHoward Hinnant                __b = copysign(_Tp(0), __b);
6233e519524SHoward Hinnant            if (isnan(__c))
6243e519524SHoward Hinnant                __c = copysign(_Tp(0), __c);
6253e519524SHoward Hinnant            if (isnan(__d))
6263e519524SHoward Hinnant                __d = copysign(_Tp(0), __d);
6273e519524SHoward Hinnant            __recalc = true;
6283e519524SHoward Hinnant        }
6293e519524SHoward Hinnant        if (__recalc)
6303e519524SHoward Hinnant        {
6313e519524SHoward Hinnant            __x = _Tp(INFINITY) * (__a * __c - __b * __d);
6323e519524SHoward Hinnant            __y = _Tp(INFINITY) * (__a * __d + __b * __c);
6333e519524SHoward Hinnant        }
6343e519524SHoward Hinnant    }
6353e519524SHoward Hinnant    return complex<_Tp>(__x, __y);
6363e519524SHoward Hinnant}
6373e519524SHoward Hinnant
6383e519524SHoward Hinnanttemplate<class _Tp>
6393e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6403e519524SHoward Hinnantcomplex<_Tp>
6413e519524SHoward Hinnantoperator*(const complex<_Tp>& __x, const _Tp& __y)
6423e519524SHoward Hinnant{
6433e519524SHoward Hinnant    complex<_Tp> __t(__x);
6443e519524SHoward Hinnant    __t *= __y;
6453e519524SHoward Hinnant    return __t;
6463e519524SHoward Hinnant}
6473e519524SHoward Hinnant
6483e519524SHoward Hinnanttemplate<class _Tp>
6493e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6503e519524SHoward Hinnantcomplex<_Tp>
6513e519524SHoward Hinnantoperator*(const _Tp& __x, const complex<_Tp>& __y)
6523e519524SHoward Hinnant{
6533e519524SHoward Hinnant    complex<_Tp> __t(__y);
6543e519524SHoward Hinnant    __t *= __x;
6553e519524SHoward Hinnant    return __t;
6563e519524SHoward Hinnant}
6573e519524SHoward Hinnant
6583e519524SHoward Hinnanttemplate<class _Tp>
6593e519524SHoward Hinnantcomplex<_Tp>
6603e519524SHoward Hinnantoperator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
6613e519524SHoward Hinnant{
6623e519524SHoward Hinnant    int __ilogbw = 0;
6633e519524SHoward Hinnant    _Tp __a = __z.real();
6643e519524SHoward Hinnant    _Tp __b = __z.imag();
6653e519524SHoward Hinnant    _Tp __c = __w.real();
6663e519524SHoward Hinnant    _Tp __d = __w.imag();
6673e519524SHoward Hinnant    _Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
6683e519524SHoward Hinnant    if (isfinite(__logbw))
6693e519524SHoward Hinnant    {
6703e519524SHoward Hinnant        __ilogbw = static_cast<int>(__logbw);
6713e519524SHoward Hinnant        __c = scalbn(__c, -__ilogbw);
6723e519524SHoward Hinnant        __d = scalbn(__d, -__ilogbw);
6733e519524SHoward Hinnant    }
6743e519524SHoward Hinnant    _Tp __denom = __c * __c + __d * __d;
6753e519524SHoward Hinnant    _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
6763e519524SHoward Hinnant    _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
6773e519524SHoward Hinnant    if (isnan(__x) && isnan(__y))
6783e519524SHoward Hinnant    {
6793e519524SHoward Hinnant        if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b)))
6803e519524SHoward Hinnant        {
6813e519524SHoward Hinnant            __x = copysign(_Tp(INFINITY), __c) * __a;
6823e519524SHoward Hinnant            __y = copysign(_Tp(INFINITY), __c) * __b;
6833e519524SHoward Hinnant        }
6843e519524SHoward Hinnant        else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d))
6853e519524SHoward Hinnant        {
6863e519524SHoward Hinnant            __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
6873e519524SHoward Hinnant            __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
6883e519524SHoward Hinnant            __x = _Tp(INFINITY) * (__a * __c + __b * __d);
6893e519524SHoward Hinnant            __y = _Tp(INFINITY) * (__b * __c - __a * __d);
6903e519524SHoward Hinnant        }
6913e519524SHoward Hinnant        else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && isfinite(__b))
6923e519524SHoward Hinnant        {
6933e519524SHoward Hinnant            __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
6943e519524SHoward Hinnant            __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
6953e519524SHoward Hinnant            __x = _Tp(0) * (__a * __c + __b * __d);
6963e519524SHoward Hinnant            __y = _Tp(0) * (__b * __c - __a * __d);
6973e519524SHoward Hinnant        }
6983e519524SHoward Hinnant    }
6993e519524SHoward Hinnant    return complex<_Tp>(__x, __y);
7003e519524SHoward Hinnant}
7013e519524SHoward Hinnant
7023e519524SHoward Hinnanttemplate<class _Tp>
7033e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7043e519524SHoward Hinnantcomplex<_Tp>
7053e519524SHoward Hinnantoperator/(const complex<_Tp>& __x, const _Tp& __y)
7063e519524SHoward Hinnant{
7073e519524SHoward Hinnant    return complex<_Tp>(__x.real() / __y, __x.imag() / __y);
7083e519524SHoward Hinnant}
7093e519524SHoward Hinnant
7103e519524SHoward Hinnanttemplate<class _Tp>
7113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7123e519524SHoward Hinnantcomplex<_Tp>
7133e519524SHoward Hinnantoperator/(const _Tp& __x, const complex<_Tp>& __y)
7143e519524SHoward Hinnant{
7153e519524SHoward Hinnant    complex<_Tp> __t(__x);
7163e519524SHoward Hinnant    __t /= __y;
7173e519524SHoward Hinnant    return __t;
7183e519524SHoward Hinnant}
7193e519524SHoward Hinnant
7203e519524SHoward Hinnanttemplate<class _Tp>
7213e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7223e519524SHoward Hinnantcomplex<_Tp>
7233e519524SHoward Hinnantoperator+(const complex<_Tp>& __x)
7243e519524SHoward Hinnant{
7253e519524SHoward Hinnant    return __x;
7263e519524SHoward Hinnant}
7273e519524SHoward Hinnant
7283e519524SHoward Hinnanttemplate<class _Tp>
7293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7303e519524SHoward Hinnantcomplex<_Tp>
7313e519524SHoward Hinnantoperator-(const complex<_Tp>& __x)
7323e519524SHoward Hinnant{
7333e519524SHoward Hinnant    return complex<_Tp>(-__x.real(), -__x.imag());
7343e519524SHoward Hinnant}
7353e519524SHoward Hinnant
7363e519524SHoward Hinnanttemplate<class _Tp>
7373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7383e519524SHoward Hinnantbool
7393e519524SHoward Hinnantoperator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
7403e519524SHoward Hinnant{
7413e519524SHoward Hinnant    return __x.real() == __y.real() && __x.imag() == __y.imag();
7423e519524SHoward Hinnant}
7433e519524SHoward Hinnant
7443e519524SHoward Hinnanttemplate<class _Tp>
7453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7463e519524SHoward Hinnantbool
7473e519524SHoward Hinnantoperator==(const complex<_Tp>& __x, const _Tp& __y)
7483e519524SHoward Hinnant{
7493e519524SHoward Hinnant    return __x.real() == __y && __x.imag() == 0;
7503e519524SHoward Hinnant}
7513e519524SHoward Hinnant
7523e519524SHoward Hinnanttemplate<class _Tp>
7533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7543e519524SHoward Hinnantbool
7553e519524SHoward Hinnantoperator==(const _Tp& __x, const complex<_Tp>& __y)
7563e519524SHoward Hinnant{
7573e519524SHoward Hinnant    return __x == __y.real() && 0 == __y.imag();
7583e519524SHoward Hinnant}
7593e519524SHoward Hinnant
7603e519524SHoward Hinnanttemplate<class _Tp>
7613e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7623e519524SHoward Hinnantbool
7633e519524SHoward Hinnantoperator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
7643e519524SHoward Hinnant{
7653e519524SHoward Hinnant    return !(__x == __y);
7663e519524SHoward Hinnant}
7673e519524SHoward Hinnant
7683e519524SHoward Hinnanttemplate<class _Tp>
7693e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7703e519524SHoward Hinnantbool
7713e519524SHoward Hinnantoperator!=(const complex<_Tp>& __x, const _Tp& __y)
7723e519524SHoward Hinnant{
7733e519524SHoward Hinnant    return !(__x == __y);
7743e519524SHoward Hinnant}
7753e519524SHoward Hinnant
7763e519524SHoward Hinnanttemplate<class _Tp>
7773e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7783e519524SHoward Hinnantbool
7793e519524SHoward Hinnantoperator!=(const _Tp& __x, const complex<_Tp>& __y)
7803e519524SHoward Hinnant{
7813e519524SHoward Hinnant    return !(__x == __y);
7823e519524SHoward Hinnant}
7833e519524SHoward Hinnant
7843e519524SHoward Hinnant// 26.3.7 values:
7853e519524SHoward Hinnant
7863e519524SHoward Hinnant// real
7873e519524SHoward Hinnant
7883e519524SHoward Hinnanttemplate<class _Tp>
7893e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7903e519524SHoward Hinnant_Tp
7913e519524SHoward Hinnantreal(const complex<_Tp>& __c)
7923e519524SHoward Hinnant{
7933e519524SHoward Hinnant    return __c.real();
7943e519524SHoward Hinnant}
7953e519524SHoward Hinnant
7963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
7973e519524SHoward Hinnantlong double
7983e519524SHoward Hinnantreal(long double __re)
7993e519524SHoward Hinnant{
8003e519524SHoward Hinnant    return __re;
8013e519524SHoward Hinnant}
8023e519524SHoward Hinnant
8033e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8043e519524SHoward Hinnantdouble
8053e519524SHoward Hinnantreal(double __re)
8063e519524SHoward Hinnant{
8073e519524SHoward Hinnant    return __re;
8083e519524SHoward Hinnant}
8093e519524SHoward Hinnant
8103e519524SHoward Hinnanttemplate<class _Tp>
8113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8123e519524SHoward Hinnanttypename enable_if
8133e519524SHoward Hinnant<
8143e519524SHoward Hinnant    is_integral<_Tp>::value,
8153e519524SHoward Hinnant    double
8163e519524SHoward Hinnant>::type
8173e519524SHoward Hinnantreal(_Tp  __re)
8183e519524SHoward Hinnant{
8193e519524SHoward Hinnant    return __re;
8203e519524SHoward Hinnant}
8213e519524SHoward Hinnant
8223e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8233e519524SHoward Hinnantfloat
8243e519524SHoward Hinnantreal(float  __re)
8253e519524SHoward Hinnant{
8263e519524SHoward Hinnant    return __re;
8273e519524SHoward Hinnant}
8283e519524SHoward Hinnant
8293e519524SHoward Hinnant// imag
8303e519524SHoward Hinnant
8313e519524SHoward Hinnanttemplate<class _Tp>
8323e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8333e519524SHoward Hinnant_Tp
8343e519524SHoward Hinnantimag(const complex<_Tp>& __c)
8353e519524SHoward Hinnant{
8363e519524SHoward Hinnant    return __c.imag();
8373e519524SHoward Hinnant}
8383e519524SHoward Hinnant
8393e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8403e519524SHoward Hinnantlong double
8413e519524SHoward Hinnantimag(long double __re)
8423e519524SHoward Hinnant{
8433e519524SHoward Hinnant    return 0;
8443e519524SHoward Hinnant}
8453e519524SHoward Hinnant
8463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8473e519524SHoward Hinnantdouble
8483e519524SHoward Hinnantimag(double __re)
8493e519524SHoward Hinnant{
8503e519524SHoward Hinnant    return 0;
8513e519524SHoward Hinnant}
8523e519524SHoward Hinnant
8533e519524SHoward Hinnanttemplate<class _Tp>
8543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8553e519524SHoward Hinnanttypename enable_if
8563e519524SHoward Hinnant<
8573e519524SHoward Hinnant    is_integral<_Tp>::value,
8583e519524SHoward Hinnant    double
8593e519524SHoward Hinnant>::type
8603e519524SHoward Hinnantimag(_Tp  __re)
8613e519524SHoward Hinnant{
8623e519524SHoward Hinnant    return 0;
8633e519524SHoward Hinnant}
8643e519524SHoward Hinnant
8653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8663e519524SHoward Hinnantfloat
8673e519524SHoward Hinnantimag(float  __re)
8683e519524SHoward Hinnant{
8693e519524SHoward Hinnant    return 0;
8703e519524SHoward Hinnant}
8713e519524SHoward Hinnant
8723e519524SHoward Hinnant// abs
8733e519524SHoward Hinnant
8743e519524SHoward Hinnanttemplate<class _Tp>
8753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8763e519524SHoward Hinnant_Tp
8773e519524SHoward Hinnantabs(const complex<_Tp>& __c)
8783e519524SHoward Hinnant{
8793e519524SHoward Hinnant    return hypot(__c.real(), __c.imag());
8803e519524SHoward Hinnant}
8813e519524SHoward Hinnant
8823e519524SHoward Hinnant// arg
8833e519524SHoward Hinnant
8843e519524SHoward Hinnanttemplate<class _Tp>
8853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8863e519524SHoward Hinnant_Tp
8873e519524SHoward Hinnantarg(const complex<_Tp>& __c)
8883e519524SHoward Hinnant{
8893e519524SHoward Hinnant    return atan2(__c.imag(), __c.real());
8903e519524SHoward Hinnant}
8913e519524SHoward Hinnant
8923e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8933e519524SHoward Hinnantlong double
8943e519524SHoward Hinnantarg(long double __re)
8953e519524SHoward Hinnant{
8963e519524SHoward Hinnant    return atan2l(0.L, __re);
8973e519524SHoward Hinnant}
8983e519524SHoward Hinnant
8993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9003e519524SHoward Hinnantdouble
9013e519524SHoward Hinnantarg(double __re)
9023e519524SHoward Hinnant{
9033e519524SHoward Hinnant    return atan2(0., __re);
9043e519524SHoward Hinnant}
9053e519524SHoward Hinnant
9063e519524SHoward Hinnanttemplate<class _Tp>
9073e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9083e519524SHoward Hinnanttypename enable_if
9093e519524SHoward Hinnant<
9103e519524SHoward Hinnant    is_integral<_Tp>::value,
9113e519524SHoward Hinnant    double
9123e519524SHoward Hinnant>::type
9133e519524SHoward Hinnantarg(_Tp __re)
9143e519524SHoward Hinnant{
9153e519524SHoward Hinnant    return atan2(0., __re);
9163e519524SHoward Hinnant}
9173e519524SHoward Hinnant
9183e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9193e519524SHoward Hinnantfloat
9203e519524SHoward Hinnantarg(float __re)
9213e519524SHoward Hinnant{
9223e519524SHoward Hinnant    return atan2f(0.F, __re);
9233e519524SHoward Hinnant}
9243e519524SHoward Hinnant
9253e519524SHoward Hinnant// norm
9263e519524SHoward Hinnant
9273e519524SHoward Hinnanttemplate<class _Tp>
9283e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9293e519524SHoward Hinnant_Tp
9303e519524SHoward Hinnantnorm(const complex<_Tp>& __c)
9313e519524SHoward Hinnant{
9323e519524SHoward Hinnant    if (isinf(__c.real()))
9333e519524SHoward Hinnant        return abs(__c.real());
9343e519524SHoward Hinnant    if (isinf(__c.imag()))
9353e519524SHoward Hinnant        return abs(__c.imag());
9363e519524SHoward Hinnant    return __c.real() * __c.real() + __c.imag() * __c.imag();
9373e519524SHoward Hinnant}
9383e519524SHoward Hinnant
9393e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9403e519524SHoward Hinnantlong double
9413e519524SHoward Hinnantnorm(long double __re)
9423e519524SHoward Hinnant{
9433e519524SHoward Hinnant    return __re * __re;
9443e519524SHoward Hinnant}
9453e519524SHoward Hinnant
9463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9473e519524SHoward Hinnantdouble
9483e519524SHoward Hinnantnorm(double __re)
9493e519524SHoward Hinnant{
9503e519524SHoward Hinnant    return __re * __re;
9513e519524SHoward Hinnant}
9523e519524SHoward Hinnant
9533e519524SHoward Hinnanttemplate<class _Tp>
9543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9553e519524SHoward Hinnanttypename enable_if
9563e519524SHoward Hinnant<
9573e519524SHoward Hinnant    is_integral<_Tp>::value,
9583e519524SHoward Hinnant    double
9593e519524SHoward Hinnant>::type
9603e519524SHoward Hinnantnorm(_Tp __re)
9613e519524SHoward Hinnant{
9623e519524SHoward Hinnant    return (double)__re * __re;
9633e519524SHoward Hinnant}
9643e519524SHoward Hinnant
9653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9663e519524SHoward Hinnantfloat
9673e519524SHoward Hinnantnorm(float __re)
9683e519524SHoward Hinnant{
9693e519524SHoward Hinnant    return __re * __re;
9703e519524SHoward Hinnant}
9713e519524SHoward Hinnant
9723e519524SHoward Hinnant// conj
9733e519524SHoward Hinnant
9743e519524SHoward Hinnanttemplate<class _Tp>
9753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9763e519524SHoward Hinnantcomplex<_Tp>
9773e519524SHoward Hinnantconj(const complex<_Tp>& __c)
9783e519524SHoward Hinnant{
9793e519524SHoward Hinnant    return complex<_Tp>(__c.real(), -__c.imag());
9803e519524SHoward Hinnant}
9813e519524SHoward Hinnant
9823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9833e519524SHoward Hinnantlong double
9843e519524SHoward Hinnantconj(long double __re)
9853e519524SHoward Hinnant{
9863e519524SHoward Hinnant    return __re;
9873e519524SHoward Hinnant}
9883e519524SHoward Hinnant
9893e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9903e519524SHoward Hinnantdouble
9913e519524SHoward Hinnantconj(double __re)
9923e519524SHoward Hinnant{
9933e519524SHoward Hinnant    return __re;
9943e519524SHoward Hinnant}
9953e519524SHoward Hinnant
9963e519524SHoward Hinnanttemplate<class _Tp>
9973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9983e519524SHoward Hinnanttypename enable_if
9993e519524SHoward Hinnant<
10003e519524SHoward Hinnant    is_integral<_Tp>::value,
10013e519524SHoward Hinnant    double
10023e519524SHoward Hinnant>::type
10033e519524SHoward Hinnantconj(_Tp __re)
10043e519524SHoward Hinnant{
10053e519524SHoward Hinnant    return __re;
10063e519524SHoward Hinnant}
10073e519524SHoward Hinnant
10083e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10093e519524SHoward Hinnantfloat
10103e519524SHoward Hinnantconj(float __re)
10113e519524SHoward Hinnant{
10123e519524SHoward Hinnant    return __re;
10133e519524SHoward Hinnant}
10143e519524SHoward Hinnant
10153e519524SHoward Hinnant// proj
10163e519524SHoward Hinnant
10173e519524SHoward Hinnanttemplate<class _Tp>
10183e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10193e519524SHoward Hinnantcomplex<_Tp>
10203e519524SHoward Hinnantproj(const complex<_Tp>& __c)
10213e519524SHoward Hinnant{
10223e519524SHoward Hinnant    std::complex<_Tp> __r = __c;
10233e519524SHoward Hinnant    if (isinf(__c.real()) || isinf(__c.imag()))
10243e519524SHoward Hinnant        __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag()));
10253e519524SHoward Hinnant    return __r;
10263e519524SHoward Hinnant}
10273e519524SHoward Hinnant
10283e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10293e519524SHoward Hinnantlong double
10303e519524SHoward Hinnantproj(long double __re)
10313e519524SHoward Hinnant{
10323e519524SHoward Hinnant    if (isinf(__re))
10333e519524SHoward Hinnant        __re = abs(__re);
10343e519524SHoward Hinnant    return __re;
10353e519524SHoward Hinnant}
10363e519524SHoward Hinnant
10373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10383e519524SHoward Hinnantdouble
10393e519524SHoward Hinnantproj(double __re)
10403e519524SHoward Hinnant{
10413e519524SHoward Hinnant    if (isinf(__re))
10423e519524SHoward Hinnant        __re = abs(__re);
10433e519524SHoward Hinnant    return __re;
10443e519524SHoward Hinnant}
10453e519524SHoward Hinnant
10463e519524SHoward Hinnanttemplate<class _Tp>
10473e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10483e519524SHoward Hinnanttypename enable_if
10493e519524SHoward Hinnant<
10503e519524SHoward Hinnant    is_integral<_Tp>::value,
10513e519524SHoward Hinnant    double
10523e519524SHoward Hinnant>::type
10533e519524SHoward Hinnantproj(_Tp __re)
10543e519524SHoward Hinnant{
10553e519524SHoward Hinnant    return __re;
10563e519524SHoward Hinnant}
10573e519524SHoward Hinnant
10583e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10593e519524SHoward Hinnantfloat
10603e519524SHoward Hinnantproj(float __re)
10613e519524SHoward Hinnant{
10623e519524SHoward Hinnant    if (isinf(__re))
10633e519524SHoward Hinnant        __re = abs(__re);
10643e519524SHoward Hinnant    return __re;
10653e519524SHoward Hinnant}
10663e519524SHoward Hinnant
10673e519524SHoward Hinnant// polar
10683e519524SHoward Hinnant
10693e519524SHoward Hinnanttemplate<class _Tp>
10703e519524SHoward Hinnantcomplex<_Tp>
10713e519524SHoward Hinnantpolar(const _Tp& __rho, const _Tp& __theta = _Tp(0))
10723e519524SHoward Hinnant{
10733e519524SHoward Hinnant    if (isnan(__rho) || signbit(__rho))
10743e519524SHoward Hinnant        return complex<_Tp>(_Tp(NAN), _Tp(NAN));
10753e519524SHoward Hinnant    if (isnan(__theta))
10763e519524SHoward Hinnant    {
10773e519524SHoward Hinnant        if (isinf(__rho))
10783e519524SHoward Hinnant            return complex<_Tp>(__rho, __theta);
10793e519524SHoward Hinnant        return complex<_Tp>(__theta, __theta);
10803e519524SHoward Hinnant    }
10813e519524SHoward Hinnant    if (isinf(__theta))
10823e519524SHoward Hinnant    {
10833e519524SHoward Hinnant        if (isinf(__rho))
10843e519524SHoward Hinnant            return complex<_Tp>(__rho, _Tp(NAN));
10853e519524SHoward Hinnant        return complex<_Tp>(_Tp(NAN), _Tp(NAN));
10863e519524SHoward Hinnant    }
10873e519524SHoward Hinnant    _Tp __x = __rho * cos(__theta);
10883e519524SHoward Hinnant    if (isnan(__x))
10893e519524SHoward Hinnant        __x = 0;
10903e519524SHoward Hinnant    _Tp __y = __rho * sin(__theta);
10913e519524SHoward Hinnant    if (isnan(__y))
10923e519524SHoward Hinnant        __y = 0;
10933e519524SHoward Hinnant    return complex<_Tp>(__x, __y);
10943e519524SHoward Hinnant}
10953e519524SHoward Hinnant
10963e519524SHoward Hinnant// log
10973e519524SHoward Hinnant
10983e519524SHoward Hinnanttemplate<class _Tp>
10993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11003e519524SHoward Hinnantcomplex<_Tp>
11013e519524SHoward Hinnantlog(const complex<_Tp>& __x)
11023e519524SHoward Hinnant{
11033e519524SHoward Hinnant    return complex<_Tp>(log(abs(__x)), arg(__x));
11043e519524SHoward Hinnant}
11053e519524SHoward Hinnant
11063e519524SHoward Hinnant// log10
11073e519524SHoward Hinnant
11083e519524SHoward Hinnanttemplate<class _Tp>
11093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11103e519524SHoward Hinnantcomplex<_Tp>
11113e519524SHoward Hinnantlog10(const complex<_Tp>& __x)
11123e519524SHoward Hinnant{
11133e519524SHoward Hinnant    return log(__x) / log(_Tp(10));
11143e519524SHoward Hinnant}
11153e519524SHoward Hinnant
11163e519524SHoward Hinnant// sqrt
11173e519524SHoward Hinnant
11183e519524SHoward Hinnanttemplate<class _Tp>
11193e519524SHoward Hinnantcomplex<_Tp>
11203e519524SHoward Hinnantsqrt(const complex<_Tp>& __x)
11213e519524SHoward Hinnant{
11223e519524SHoward Hinnant    if (isinf(__x.imag()))
11233e519524SHoward Hinnant        return complex<_Tp>(_Tp(INFINITY), __x.imag());
11243e519524SHoward Hinnant    if (isinf(__x.real()))
11253e519524SHoward Hinnant    {
11263e519524SHoward Hinnant        if (__x.real() > _Tp(0))
11273e519524SHoward Hinnant            return complex<_Tp>(__x.real(), isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
11283e519524SHoward Hinnant        return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
11293e519524SHoward Hinnant    }
11303e519524SHoward Hinnant    return polar(sqrt(abs(__x)), arg(__x) / _Tp(2));
11313e519524SHoward Hinnant}
11323e519524SHoward Hinnant
11333e519524SHoward Hinnant// exp
11343e519524SHoward Hinnant
11353e519524SHoward Hinnanttemplate<class _Tp>
11363e519524SHoward Hinnantcomplex<_Tp>
11373e519524SHoward Hinnantexp(const complex<_Tp>& __x)
11383e519524SHoward Hinnant{
11393e519524SHoward Hinnant    _Tp __i = __x.imag();
11403e519524SHoward Hinnant    if (isinf(__x.real()))
11413e519524SHoward Hinnant    {
11423e519524SHoward Hinnant        if (__x.real() < _Tp(0))
11433e519524SHoward Hinnant        {
11443e519524SHoward Hinnant            if (!isfinite(__i))
11453e519524SHoward Hinnant                __i = _Tp(1);
11463e519524SHoward Hinnant        }
11473e519524SHoward Hinnant        else if (__i == 0 || !isfinite(__i))
11483e519524SHoward Hinnant        {
11493e519524SHoward Hinnant            if (isinf(__i))
11503e519524SHoward Hinnant                __i = _Tp(NAN);
11513e519524SHoward Hinnant            return complex<_Tp>(__x.real(), __i);
11523e519524SHoward Hinnant        }
11533e519524SHoward Hinnant    }
11543e519524SHoward Hinnant    else if (isnan(__x.real()) && __x.imag() == 0)
11553e519524SHoward Hinnant        return __x;
11563e519524SHoward Hinnant    _Tp __e = exp(__x.real());
11573e519524SHoward Hinnant    return complex<_Tp>(__e * cos(__i), __e * sin(__i));
11583e519524SHoward Hinnant}
11593e519524SHoward Hinnant
11603e519524SHoward Hinnant// pow
11613e519524SHoward Hinnant
11623e519524SHoward Hinnanttemplate<class _Tp>
11633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11643e519524SHoward Hinnantcomplex<_Tp>
11653e519524SHoward Hinnantpow(const complex<_Tp>& __x, const complex<_Tp>& __y)
11663e519524SHoward Hinnant{
11673e519524SHoward Hinnant    return exp(__y * log(__x));
11683e519524SHoward Hinnant}
11693e519524SHoward Hinnant
11703e519524SHoward Hinnanttemplate<class _Tp, class _Up>
11713e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11723e519524SHoward Hinnantcomplex<typename __promote<_Tp, _Up>::type>
11733e519524SHoward Hinnantpow(const complex<_Tp>& __x, const complex<_Up>& __y)
11743e519524SHoward Hinnant{
11753e519524SHoward Hinnant    typedef complex<typename __promote<_Tp, _Up>::type> result_type;
11763e519524SHoward Hinnant    return _STD::pow(result_type(__x), result_type(__y));
11773e519524SHoward Hinnant}
11783e519524SHoward Hinnant
11793e519524SHoward Hinnanttemplate<class _Tp, class _Up>
11803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11813e519524SHoward Hinnanttypename enable_if
11823e519524SHoward Hinnant<
11833e519524SHoward Hinnant    is_arithmetic<_Up>::value,
11843e519524SHoward Hinnant    complex<typename __promote<_Tp, _Up>::type>
11853e519524SHoward Hinnant>::type
11863e519524SHoward Hinnantpow(const complex<_Tp>& __x, const _Up& __y)
11873e519524SHoward Hinnant{
11883e519524SHoward Hinnant    typedef complex<typename __promote<_Tp, _Up>::type> result_type;
11893e519524SHoward Hinnant    return _STD::pow(result_type(__x), result_type(__y));
11903e519524SHoward Hinnant}
11913e519524SHoward Hinnant
11923e519524SHoward Hinnanttemplate<class _Tp, class _Up>
11933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
11943e519524SHoward Hinnanttypename enable_if
11953e519524SHoward Hinnant<
11963e519524SHoward Hinnant    is_arithmetic<_Tp>::value,
11973e519524SHoward Hinnant    complex<typename __promote<_Tp, _Up>::type>
11983e519524SHoward Hinnant>::type
11993e519524SHoward Hinnantpow(const _Tp& __x, const complex<_Up>& __y)
12003e519524SHoward Hinnant{
12013e519524SHoward Hinnant    typedef complex<typename __promote<_Tp, _Up>::type> result_type;
12023e519524SHoward Hinnant    return _STD::pow(result_type(__x), result_type(__y));
12033e519524SHoward Hinnant}
12043e519524SHoward Hinnant
12053e519524SHoward Hinnant// asinh
12063e519524SHoward Hinnant
12073e519524SHoward Hinnanttemplate<class _Tp>
12083e519524SHoward Hinnantcomplex<_Tp>
12093e519524SHoward Hinnantasinh(const complex<_Tp>& __x)
12103e519524SHoward Hinnant{
12113e519524SHoward Hinnant    const _Tp __pi(atan2(+0., -0.));
12123e519524SHoward Hinnant    if (isinf(__x.real()))
12133e519524SHoward Hinnant    {
12143e519524SHoward Hinnant        if (isnan(__x.imag()))
12153e519524SHoward Hinnant            return __x;
12163e519524SHoward Hinnant        if (isinf(__x.imag()))
12173e519524SHoward Hinnant            return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
12183e519524SHoward Hinnant        return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
12193e519524SHoward Hinnant    }
12203e519524SHoward Hinnant    if (isnan(__x.real()))
12213e519524SHoward Hinnant    {
12223e519524SHoward Hinnant        if (isinf(__x.imag()))
12233e519524SHoward Hinnant            return complex<_Tp>(__x.imag(), __x.real());
12243e519524SHoward Hinnant        if (__x.imag() == 0)
12253e519524SHoward Hinnant            return __x;
12263e519524SHoward Hinnant        return complex<_Tp>(__x.real(), __x.real());
12273e519524SHoward Hinnant    }
12283e519524SHoward Hinnant    if (isinf(__x.imag()))
12293e519524SHoward Hinnant        return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
12303e519524SHoward Hinnant    complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1)));
12313e519524SHoward Hinnant    return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
12323e519524SHoward Hinnant}
12333e519524SHoward Hinnant
12343e519524SHoward Hinnant// acosh
12353e519524SHoward Hinnant
12363e519524SHoward Hinnanttemplate<class _Tp>
12373e519524SHoward Hinnantcomplex<_Tp>
12383e519524SHoward Hinnantacosh(const complex<_Tp>& __x)
12393e519524SHoward Hinnant{
12403e519524SHoward Hinnant    const _Tp __pi(atan2(+0., -0.));
12413e519524SHoward Hinnant    if (isinf(__x.real()))
12423e519524SHoward Hinnant    {
12433e519524SHoward Hinnant        if (isnan(__x.imag()))
12443e519524SHoward Hinnant            return complex<_Tp>(abs(__x.real()), __x.imag());
12453e519524SHoward Hinnant        if (isinf(__x.imag()))
12463e519524SHoward Hinnant            if (__x.real() > 0)
12473e519524SHoward Hinnant                return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
12483e519524SHoward Hinnant            else
12493e519524SHoward Hinnant                return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag()));
12503e519524SHoward Hinnant        if (__x.real() < 0)
12513e519524SHoward Hinnant            return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag()));
12523e519524SHoward Hinnant        return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
12533e519524SHoward Hinnant    }
12543e519524SHoward Hinnant    if (isnan(__x.real()))
12553e519524SHoward Hinnant    {
12563e519524SHoward Hinnant        if (isinf(__x.imag()))
12573e519524SHoward Hinnant            return complex<_Tp>(abs(__x.imag()), __x.real());
12583e519524SHoward Hinnant        return complex<_Tp>(__x.real(), __x.real());
12593e519524SHoward Hinnant    }
12603e519524SHoward Hinnant    if (isinf(__x.imag()))
12613e519524SHoward Hinnant        return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag()));
12623e519524SHoward Hinnant    complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
12633e519524SHoward Hinnant    return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag()));
12643e519524SHoward Hinnant}
12653e519524SHoward Hinnant
12663e519524SHoward Hinnant// atanh
12673e519524SHoward Hinnant
12683e519524SHoward Hinnanttemplate<class _Tp>
12693e519524SHoward Hinnantcomplex<_Tp>
12703e519524SHoward Hinnantatanh(const complex<_Tp>& __x)
12713e519524SHoward Hinnant{
12723e519524SHoward Hinnant    const _Tp __pi(atan2(+0., -0.));
12733e519524SHoward Hinnant    if (isinf(__x.imag()))
12743e519524SHoward Hinnant    {
12753e519524SHoward Hinnant        return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
12763e519524SHoward Hinnant    }
12773e519524SHoward Hinnant    if (isnan(__x.imag()))
12783e519524SHoward Hinnant    {
12793e519524SHoward Hinnant        if (isinf(__x.real()) || __x.real() == 0)
12803e519524SHoward Hinnant            return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag());
12813e519524SHoward Hinnant        return complex<_Tp>(__x.imag(), __x.imag());
12823e519524SHoward Hinnant    }
12833e519524SHoward Hinnant    if (isnan(__x.real()))
12843e519524SHoward Hinnant    {
12853e519524SHoward Hinnant        return complex<_Tp>(__x.real(), __x.real());
12863e519524SHoward Hinnant    }
12873e519524SHoward Hinnant    if (isinf(__x.real()))
12883e519524SHoward Hinnant    {
12893e519524SHoward Hinnant        return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
12903e519524SHoward Hinnant    }
12913e519524SHoward Hinnant    if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0))
12923e519524SHoward Hinnant    {
12933e519524SHoward Hinnant        return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag()));
12943e519524SHoward Hinnant    }
12953e519524SHoward Hinnant    complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2);
12963e519524SHoward Hinnant    return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
12973e519524SHoward Hinnant}
12983e519524SHoward Hinnant
12993e519524SHoward Hinnant// sinh
13003e519524SHoward Hinnant
13013e519524SHoward Hinnanttemplate<class _Tp>
13023e519524SHoward Hinnantcomplex<_Tp>
13033e519524SHoward Hinnantsinh(const complex<_Tp>& __x)
13043e519524SHoward Hinnant{
13053e519524SHoward Hinnant    if (isinf(__x.real()) && !isfinite(__x.imag()))
13063e519524SHoward Hinnant        return complex<_Tp>(__x.real(), _Tp(NAN));
13073e519524SHoward Hinnant    if (__x.real() == 0 && !isfinite(__x.imag()))
13083e519524SHoward Hinnant        return complex<_Tp>(__x.real(), _Tp(NAN));
13093e519524SHoward Hinnant    if (__x.imag() == 0 && !isfinite(__x.real()))
13103e519524SHoward Hinnant        return __x;
13113e519524SHoward Hinnant    return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag()));
13123e519524SHoward Hinnant}
13133e519524SHoward Hinnant
13143e519524SHoward Hinnant// cosh
13153e519524SHoward Hinnant
13163e519524SHoward Hinnanttemplate<class _Tp>
13173e519524SHoward Hinnantcomplex<_Tp>
13183e519524SHoward Hinnantcosh(const complex<_Tp>& __x)
13193e519524SHoward Hinnant{
13203e519524SHoward Hinnant    if (isinf(__x.real()) && !isfinite(__x.imag()))
13213e519524SHoward Hinnant        return complex<_Tp>(abs(__x.real()), _Tp(NAN));
13223e519524SHoward Hinnant    if (__x.real() == 0 && !isfinite(__x.imag()))
13233e519524SHoward Hinnant        return complex<_Tp>(_Tp(NAN), __x.real());
13243e519524SHoward Hinnant    if (__x.real() == 0 && __x.imag() == 0)
13253e519524SHoward Hinnant        return complex<_Tp>(_Tp(1), __x.imag());
13263e519524SHoward Hinnant    if (__x.imag() == 0 && !isfinite(__x.real()))
13273e519524SHoward Hinnant        return complex<_Tp>(abs(__x.real()), __x.imag());
13283e519524SHoward Hinnant    return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag()));
13293e519524SHoward Hinnant}
13303e519524SHoward Hinnant
13313e519524SHoward Hinnant// tanh
13323e519524SHoward Hinnant
13333e519524SHoward Hinnanttemplate<class _Tp>
13343e519524SHoward Hinnantcomplex<_Tp>
13353e519524SHoward Hinnanttanh(const complex<_Tp>& __x)
13363e519524SHoward Hinnant{
13373e519524SHoward Hinnant    if (isinf(__x.real()))
13383e519524SHoward Hinnant    {
13393e519524SHoward Hinnant        if (!isfinite(__x.imag()))
13403e519524SHoward Hinnant            return complex<_Tp>(_Tp(1), _Tp(0));
13413e519524SHoward Hinnant        return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag())));
13423e519524SHoward Hinnant    }
13433e519524SHoward Hinnant    if (isnan(__x.real()) && __x.imag() == 0)
13443e519524SHoward Hinnant        return __x;
13453e519524SHoward Hinnant    _Tp __2r(_Tp(2) * __x.real());
13463e519524SHoward Hinnant    _Tp __2i(_Tp(2) * __x.imag());
13473e519524SHoward Hinnant    _Tp __d(cosh(__2r) + cos(__2i));
13483e519524SHoward Hinnant    return  complex<_Tp>(sinh(__2r)/__d, sin(__2i)/__d);
13493e519524SHoward Hinnant}
13503e519524SHoward Hinnant
13513e519524SHoward Hinnant// asin
13523e519524SHoward Hinnant
13533e519524SHoward Hinnanttemplate<class _Tp>
13543e519524SHoward Hinnantcomplex<_Tp>
13553e519524SHoward Hinnantasin(const complex<_Tp>& __x)
13563e519524SHoward Hinnant{
13573e519524SHoward Hinnant    complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real()));
13583e519524SHoward Hinnant    return complex<_Tp>(__z.imag(), -__z.real());
13593e519524SHoward Hinnant}
13603e519524SHoward Hinnant
13613e519524SHoward Hinnant// acos
13623e519524SHoward Hinnant
13633e519524SHoward Hinnanttemplate<class _Tp>
13643e519524SHoward Hinnantcomplex<_Tp>
13653e519524SHoward Hinnantacos(const complex<_Tp>& __x)
13663e519524SHoward Hinnant{
13673e519524SHoward Hinnant    const _Tp __pi(atan2(+0., -0.));
13683e519524SHoward Hinnant    if (isinf(__x.real()))
13693e519524SHoward Hinnant    {
13703e519524SHoward Hinnant        if (isnan(__x.imag()))
13713e519524SHoward Hinnant            return complex<_Tp>(__x.imag(), __x.real());
13723e519524SHoward Hinnant        if (isinf(__x.imag()))
13733e519524SHoward Hinnant        {
13743e519524SHoward Hinnant            if (__x.real() < _Tp(0))
13753e519524SHoward Hinnant                return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag());
13763e519524SHoward Hinnant            return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag());
13773e519524SHoward Hinnant        }
13783e519524SHoward Hinnant        if (__x.real() < _Tp(0))
13793e519524SHoward Hinnant            return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real());
13803e519524SHoward Hinnant        return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real());
13813e519524SHoward Hinnant    }
13823e519524SHoward Hinnant    if (isnan(__x.real()))
13833e519524SHoward Hinnant    {
13843e519524SHoward Hinnant        if (isinf(__x.imag()))
13853e519524SHoward Hinnant            return complex<_Tp>(__x.real(), -__x.imag());
13863e519524SHoward Hinnant        return complex<_Tp>(__x.real(), __x.real());
13873e519524SHoward Hinnant    }
13883e519524SHoward Hinnant    if (isinf(__x.imag()))
13893e519524SHoward Hinnant        return complex<_Tp>(__pi/_Tp(2), -__x.imag());
13903e519524SHoward Hinnant    if (__x.real() == 0)
13913e519524SHoward Hinnant        return complex<_Tp>(__pi/_Tp(2), -__x.imag());
13923e519524SHoward Hinnant    complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
13933e519524SHoward Hinnant    if (signbit(__x.imag()))
13943e519524SHoward Hinnant        return complex<_Tp>(abs(__z.imag()), abs(__z.real()));
13953e519524SHoward Hinnant    return complex<_Tp>(abs(__z.imag()), -abs(__z.real()));
13963e519524SHoward Hinnant}
13973e519524SHoward Hinnant
13983e519524SHoward Hinnant// atan
13993e519524SHoward Hinnant
14003e519524SHoward Hinnanttemplate<class _Tp>
14013e519524SHoward Hinnantcomplex<_Tp>
14023e519524SHoward Hinnantatan(const complex<_Tp>& __x)
14033e519524SHoward Hinnant{
14043e519524SHoward Hinnant    complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real()));
14053e519524SHoward Hinnant    return complex<_Tp>(__z.imag(), -__z.real());
14063e519524SHoward Hinnant}
14073e519524SHoward Hinnant
14083e519524SHoward Hinnant// sin
14093e519524SHoward Hinnant
14103e519524SHoward Hinnanttemplate<class _Tp>
14113e519524SHoward Hinnantcomplex<_Tp>
14123e519524SHoward Hinnantsin(const complex<_Tp>& __x)
14133e519524SHoward Hinnant{
14143e519524SHoward Hinnant    complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real()));
14153e519524SHoward Hinnant    return complex<_Tp>(__z.imag(), -__z.real());
14163e519524SHoward Hinnant}
14173e519524SHoward Hinnant
14183e519524SHoward Hinnant// cos
14193e519524SHoward Hinnant
14203e519524SHoward Hinnanttemplate<class _Tp>
14213e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14223e519524SHoward Hinnantcomplex<_Tp>
14233e519524SHoward Hinnantcos(const complex<_Tp>& __x)
14243e519524SHoward Hinnant{
14253e519524SHoward Hinnant    return cosh(complex<_Tp>(-__x.imag(), __x.real()));
14263e519524SHoward Hinnant}
14273e519524SHoward Hinnant
14283e519524SHoward Hinnant// tan
14293e519524SHoward Hinnant
14303e519524SHoward Hinnanttemplate<class _Tp>
14313e519524SHoward Hinnantcomplex<_Tp>
14323e519524SHoward Hinnanttan(const complex<_Tp>& __x)
14333e519524SHoward Hinnant{
14343e519524SHoward Hinnant    complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real()));
14353e519524SHoward Hinnant    return complex<_Tp>(__z.imag(), -__z.real());
14363e519524SHoward Hinnant}
14373e519524SHoward Hinnant
14383e519524SHoward Hinnanttemplate<class _Tp, class _CharT, class _Traits>
14393e519524SHoward Hinnantbasic_istream<_CharT, _Traits>&
14403e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
14413e519524SHoward Hinnant{
14423e519524SHoward Hinnant    if (__is.good())
14433e519524SHoward Hinnant    {
14443e519524SHoward Hinnant        ws(__is);
14453e519524SHoward Hinnant        if (__is.peek() == _CharT('('))
14463e519524SHoward Hinnant        {
14473e519524SHoward Hinnant            __is.get();
14483e519524SHoward Hinnant            _Tp __r;
14493e519524SHoward Hinnant            __is >> __r;
14503e519524SHoward Hinnant            if (!__is.fail())
14513e519524SHoward Hinnant            {
14523e519524SHoward Hinnant                ws(__is);
14533e519524SHoward Hinnant                _CharT __c = __is.peek();
14543e519524SHoward Hinnant                if (__c == _CharT(','))
14553e519524SHoward Hinnant                {
14563e519524SHoward Hinnant                    __is.get();
14573e519524SHoward Hinnant                    _Tp __i;
14583e519524SHoward Hinnant                    __is >> __i;
14593e519524SHoward Hinnant                    if (!__is.fail())
14603e519524SHoward Hinnant                    {
14613e519524SHoward Hinnant                        ws(__is);
14623e519524SHoward Hinnant                        __c = __is.peek();
14633e519524SHoward Hinnant                        if (__c == _CharT(')'))
14643e519524SHoward Hinnant                        {
14653e519524SHoward Hinnant                            __is.get();
14663e519524SHoward Hinnant                            __x = complex<_Tp>(__r, __i);
14673e519524SHoward Hinnant                        }
14683e519524SHoward Hinnant                        else
14693e519524SHoward Hinnant                            __is.setstate(ios_base::failbit);
14703e519524SHoward Hinnant                    }
14713e519524SHoward Hinnant                    else
14723e519524SHoward Hinnant                        __is.setstate(ios_base::failbit);
14733e519524SHoward Hinnant                }
14743e519524SHoward Hinnant                else if (__c == _CharT(')'))
14753e519524SHoward Hinnant                {
14763e519524SHoward Hinnant                    __is.get();
14773e519524SHoward Hinnant                    __x = complex<_Tp>(__r, _Tp(0));
14783e519524SHoward Hinnant                }
14793e519524SHoward Hinnant                else
14803e519524SHoward Hinnant                    __is.setstate(ios_base::failbit);
14813e519524SHoward Hinnant            }
14823e519524SHoward Hinnant            else
14833e519524SHoward Hinnant                __is.setstate(ios_base::failbit);
14843e519524SHoward Hinnant        }
14853e519524SHoward Hinnant        else
14863e519524SHoward Hinnant        {
14873e519524SHoward Hinnant            _Tp __r;
14883e519524SHoward Hinnant            __is >> __r;
14893e519524SHoward Hinnant            if (!__is.fail())
14903e519524SHoward Hinnant                __x = complex<_Tp>(__r, _Tp(0));
14913e519524SHoward Hinnant            else
14923e519524SHoward Hinnant                __is.setstate(ios_base::failbit);
14933e519524SHoward Hinnant        }
14943e519524SHoward Hinnant    }
14953e519524SHoward Hinnant    else
14963e519524SHoward Hinnant        __is.setstate(ios_base::failbit);
14973e519524SHoward Hinnant    return __is;
14983e519524SHoward Hinnant}
14993e519524SHoward Hinnant
15003e519524SHoward Hinnanttemplate<class _Tp, class _CharT, class _Traits>
15013e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>&
15023e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
15033e519524SHoward Hinnant{
15043e519524SHoward Hinnant    basic_ostringstream<_CharT, _Traits> __s;
15053e519524SHoward Hinnant    __s.flags(__os.flags());
15063e519524SHoward Hinnant    __s.imbue(__os.getloc());
15073e519524SHoward Hinnant    __s.precision(__os.precision());
15083e519524SHoward Hinnant    __s << '(' << __x.real() << ',' << __x.imag() << ')';
15093e519524SHoward Hinnant    return __os << __s.str();
15103e519524SHoward Hinnant}
15113e519524SHoward Hinnant
15123e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
15133e519524SHoward Hinnant
15143e519524SHoward Hinnant#endif  // _LIBCPP_COMPLEX
1515