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