13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_COMPLEX 113e519524SHoward Hinnant#define _LIBCPP_COMPLEX 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant complex synopsis 153e519524SHoward Hinnant 163e519524SHoward Hinnantnamespace std 173e519524SHoward Hinnant{ 183e519524SHoward Hinnant 193e519524SHoward Hinnanttemplate<class T> 203e519524SHoward Hinnantclass complex 213e519524SHoward Hinnant{ 223e519524SHoward Hinnantpublic: 233e519524SHoward Hinnant typedef T value_type; 243e519524SHoward Hinnant 25a1cd1916SMarshall Clow complex(const T& re = T(), const T& im = T()); // constexpr in C++14 26a1cd1916SMarshall Clow complex(const complex&); // constexpr in C++14 27a1cd1916SMarshall Clow template<class X> complex(const complex<X>&); // constexpr in C++14 283e519524SHoward Hinnant 29a1cd1916SMarshall Clow T real() const; // constexpr in C++14 30a1cd1916SMarshall Clow T imag() const; // constexpr in C++14 313e519524SHoward Hinnant 323e519524SHoward Hinnant void real(T); 333e519524SHoward Hinnant void imag(T); 343e519524SHoward Hinnant 353e519524SHoward Hinnant complex<T>& operator= (const T&); 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 413e519524SHoward Hinnant complex& operator=(const complex&); 423e519524SHoward Hinnant template<class X> complex<T>& operator= (const complex<X>&); 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}; 483e519524SHoward Hinnant 493e519524SHoward Hinnanttemplate<> 503e519524SHoward Hinnantclass complex<float> 513e519524SHoward Hinnant{ 523e519524SHoward Hinnantpublic: 533e519524SHoward Hinnant typedef float value_type; 543e519524SHoward Hinnant 553e519524SHoward Hinnant constexpr complex(float re = 0.0f, float im = 0.0f); 563e519524SHoward Hinnant explicit constexpr complex(const complex<double>&); 573e519524SHoward Hinnant explicit constexpr complex(const complex<long double>&); 583e519524SHoward Hinnant 593e519524SHoward Hinnant constexpr float real() const; 603e519524SHoward Hinnant void real(float); 613e519524SHoward Hinnant constexpr float imag() const; 623e519524SHoward Hinnant void imag(float); 633e519524SHoward Hinnant 643e519524SHoward Hinnant complex<float>& operator= (float); 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 703e519524SHoward Hinnant complex<float>& operator=(const complex<float>&); 713e519524SHoward Hinnant template<class X> complex<float>& operator= (const complex<X>&); 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}; 773e519524SHoward Hinnant 783e519524SHoward Hinnanttemplate<> 793e519524SHoward Hinnantclass complex<double> 803e519524SHoward Hinnant{ 813e519524SHoward Hinnantpublic: 823e519524SHoward Hinnant typedef double value_type; 833e519524SHoward Hinnant 843e519524SHoward Hinnant constexpr complex(double re = 0.0, double im = 0.0); 853e519524SHoward Hinnant constexpr complex(const complex<float>&); 863e519524SHoward Hinnant explicit constexpr complex(const complex<long double>&); 873e519524SHoward Hinnant 883e519524SHoward Hinnant constexpr double real() const; 893e519524SHoward Hinnant void real(double); 903e519524SHoward Hinnant constexpr double imag() const; 913e519524SHoward Hinnant void imag(double); 923e519524SHoward Hinnant 933e519524SHoward Hinnant complex<double>& operator= (double); 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=(const complex<double>&); 993e519524SHoward Hinnant 1003e519524SHoward Hinnant template<class X> complex<double>& operator= (const complex<X>&); 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}; 1063e519524SHoward Hinnant 1073e519524SHoward Hinnanttemplate<> 1083e519524SHoward Hinnantclass complex<long double> 1093e519524SHoward Hinnant{ 1103e519524SHoward Hinnantpublic: 1113e519524SHoward Hinnant typedef long double value_type; 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant constexpr complex(long double re = 0.0L, long double im = 0.0L); 1143e519524SHoward Hinnant constexpr complex(const complex<float>&); 1153e519524SHoward Hinnant constexpr complex(const complex<double>&); 1163e519524SHoward Hinnant 1173e519524SHoward Hinnant constexpr long double real() const; 1183e519524SHoward Hinnant void real(long double); 1193e519524SHoward Hinnant constexpr long double imag() const; 1203e519524SHoward Hinnant void imag(long double); 1213e519524SHoward Hinnant 1223e519524SHoward Hinnant complex<long double>& operator=(const complex<long double>&); 1233e519524SHoward Hinnant complex<long double>& operator= (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 1293e519524SHoward Hinnant template<class X> complex<long double>& operator= (const complex<X>&); 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}; 1353e519524SHoward Hinnant 1363e519524SHoward Hinnant// 26.3.6 operators: 1373e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const complex<T>&, const complex<T>&); 1383e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const complex<T>&, const T&); 1393e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const T&, const complex<T>&); 1403e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const complex<T>&, const complex<T>&); 1413e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const complex<T>&, const T&); 1423e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const T&, const complex<T>&); 1433e519524SHoward Hinnanttemplate<class T> complex<T> operator*(const complex<T>&, const complex<T>&); 1443e519524SHoward Hinnanttemplate<class T> complex<T> operator*(const complex<T>&, const T&); 1453e519524SHoward Hinnanttemplate<class T> complex<T> operator*(const T&, const complex<T>&); 1463e519524SHoward Hinnanttemplate<class T> complex<T> operator/(const complex<T>&, const complex<T>&); 1473e519524SHoward Hinnanttemplate<class T> complex<T> operator/(const complex<T>&, const T&); 1483e519524SHoward Hinnanttemplate<class T> complex<T> operator/(const T&, const complex<T>&); 1493e519524SHoward Hinnanttemplate<class T> complex<T> operator+(const complex<T>&); 1503e519524SHoward Hinnanttemplate<class T> complex<T> operator-(const complex<T>&); 151a1cd1916SMarshall Clowtemplate<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14 152a1cd1916SMarshall Clowtemplate<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14 153a1cd1916SMarshall Clowtemplate<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14 154a1cd1916SMarshall Clowtemplate<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14 155a1cd1916SMarshall Clowtemplate<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14 156a1cd1916SMarshall Clowtemplate<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14 1573e519524SHoward Hinnant 1583e519524SHoward Hinnanttemplate<class T, class charT, class traits> 1593e519524SHoward Hinnant basic_istream<charT, traits>& 1603e519524SHoward Hinnant operator>>(basic_istream<charT, traits>&, complex<T>&); 1613e519524SHoward Hinnanttemplate<class T, class charT, class traits> 1623e519524SHoward Hinnant basic_ostream<charT, traits>& 1633e519524SHoward Hinnant operator<<(basic_ostream<charT, traits>&, const complex<T>&); 1643e519524SHoward Hinnant 1653e519524SHoward Hinnant// 26.3.7 values: 1663e519524SHoward Hinnant 167a1cd1916SMarshall Clowtemplate<class T> T real(const complex<T>&); // constexpr in C++14 168a1cd1916SMarshall Clow long double real(long double); // constexpr in C++14 169a1cd1916SMarshall Clow double real(double); // constexpr in C++14 170a1cd1916SMarshall Clowtemplate<Integral T> double real(T); // constexpr in C++14 171a1cd1916SMarshall Clow float real(float); // constexpr in C++14 1723e519524SHoward Hinnant 173a1cd1916SMarshall Clowtemplate<class T> T imag(const complex<T>&); // constexpr in C++14 174a1cd1916SMarshall Clow long double imag(long double); // constexpr in C++14 175a1cd1916SMarshall Clow double imag(double); // constexpr in C++14 176a1cd1916SMarshall Clowtemplate<Integral T> double imag(T); // constexpr in C++14 177a1cd1916SMarshall Clow float imag(float); // constexpr in C++14 1783e519524SHoward Hinnant 1793e519524SHoward Hinnanttemplate<class T> T abs(const complex<T>&); 1803e519524SHoward Hinnant 1813e519524SHoward Hinnanttemplate<class T> T arg(const complex<T>&); 1823e519524SHoward Hinnant long double arg(long double); 1833e519524SHoward Hinnant double arg(double); 1843e519524SHoward Hinnanttemplate<Integral T> double arg(T); 1853e519524SHoward Hinnant float arg(float); 1863e519524SHoward Hinnant 1873e519524SHoward Hinnanttemplate<class T> T norm(const complex<T>&); 1883e519524SHoward Hinnant long double norm(long double); 1893e519524SHoward Hinnant double norm(double); 1903e519524SHoward Hinnanttemplate<Integral T> double norm(T); 1913e519524SHoward Hinnant float norm(float); 1923e519524SHoward Hinnant 1933e519524SHoward Hinnanttemplate<class T> complex<T> conj(const complex<T>&); 194d518d1c8SHoward Hinnant complex<long double> conj(long double); 195d518d1c8SHoward Hinnant complex<double> conj(double); 196d518d1c8SHoward Hinnanttemplate<Integral T> complex<double> conj(T); 197d518d1c8SHoward Hinnant complex<float> conj(float); 1983e519524SHoward Hinnant 1993e519524SHoward Hinnanttemplate<class T> complex<T> proj(const complex<T>&); 200d518d1c8SHoward Hinnant complex<long double> proj(long double); 201d518d1c8SHoward Hinnant complex<double> proj(double); 202d518d1c8SHoward Hinnanttemplate<Integral T> complex<double> proj(T); 203d518d1c8SHoward Hinnant complex<float> proj(float); 2043e519524SHoward Hinnant 2050551d83eSMarshall Clowtemplate<class T> complex<T> polar(const T&, const T& = T()); 2063e519524SHoward Hinnant 2073e519524SHoward Hinnant// 26.3.8 transcendentals: 2083e519524SHoward Hinnanttemplate<class T> complex<T> acos(const complex<T>&); 2093e519524SHoward Hinnanttemplate<class T> complex<T> asin(const complex<T>&); 2103e519524SHoward Hinnanttemplate<class T> complex<T> atan(const complex<T>&); 2113e519524SHoward Hinnanttemplate<class T> complex<T> acosh(const complex<T>&); 2123e519524SHoward Hinnanttemplate<class T> complex<T> asinh(const complex<T>&); 2133e519524SHoward Hinnanttemplate<class T> complex<T> atanh(const complex<T>&); 2143e519524SHoward Hinnanttemplate<class T> complex<T> cos (const complex<T>&); 2153e519524SHoward Hinnanttemplate<class T> complex<T> cosh (const complex<T>&); 2163e519524SHoward Hinnanttemplate<class T> complex<T> exp (const complex<T>&); 2173e519524SHoward Hinnanttemplate<class T> complex<T> log (const complex<T>&); 2183e519524SHoward Hinnanttemplate<class T> complex<T> log10(const complex<T>&); 2193e519524SHoward Hinnant 2203e519524SHoward Hinnanttemplate<class T> complex<T> pow(const complex<T>&, const T&); 2213e519524SHoward Hinnanttemplate<class T> complex<T> pow(const complex<T>&, const complex<T>&); 2223e519524SHoward Hinnanttemplate<class T> complex<T> pow(const T&, const complex<T>&); 2233e519524SHoward Hinnant 2243e519524SHoward Hinnanttemplate<class T> complex<T> sin (const complex<T>&); 2253e519524SHoward Hinnanttemplate<class T> complex<T> sinh (const complex<T>&); 2263e519524SHoward Hinnanttemplate<class T> complex<T> sqrt (const complex<T>&); 2273e519524SHoward Hinnanttemplate<class T> complex<T> tan (const complex<T>&); 2283e519524SHoward Hinnanttemplate<class T> complex<T> tanh (const complex<T>&); 2293e519524SHoward Hinnant 2303e519524SHoward Hinnant} // std 2313e519524SHoward Hinnant 2323e519524SHoward Hinnant*/ 2333e519524SHoward Hinnant 234*385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 2353e519524SHoward Hinnant#include <__config> 2363e519524SHoward Hinnant#include <cmath> 237c3478effSLouis Dionne#include <iosfwd> 238bfbd73f8SArthur O'Dwyer#include <stdexcept> 239bfbd73f8SArthur O'Dwyer#include <type_traits> 240f56972e2SMarshall Clow#include <version> 2413e519524SHoward Hinnant 24288ffc727SLouis Dionne#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) 24388ffc727SLouis Dionne# include <sstream> // for std::basic_ostringstream 24488ffc727SLouis Dionne#endif 24588ffc727SLouis Dionne 246073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2473e519524SHoward Hinnant# pragma GCC system_header 248073458b1SHoward Hinnant#endif 2493e519524SHoward Hinnant 2503e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 2513e519524SHoward Hinnant 252e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS complex; 2533e519524SHoward Hinnant 2543e519524SHoward Hinnanttemplate<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w); 2553e519524SHoward Hinnanttemplate<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y); 2563e519524SHoward Hinnant 2573e519524SHoward Hinnanttemplate<class _Tp> 258e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS complex 2593e519524SHoward Hinnant{ 2603e519524SHoward Hinnantpublic: 2613e519524SHoward Hinnant typedef _Tp value_type; 2623e519524SHoward Hinnantprivate: 2633e519524SHoward Hinnant value_type __re_; 2643e519524SHoward Hinnant value_type __im_; 2653e519524SHoward Hinnantpublic: 266a1cd1916SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2673e519524SHoward Hinnant complex(const value_type& __re = value_type(), const value_type& __im = value_type()) 2683e519524SHoward Hinnant : __re_(__re), __im_(__im) {} 269a1cd1916SMarshall Clow template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2703e519524SHoward Hinnant complex(const complex<_Xp>& __c) 2713e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 2723e519524SHoward Hinnant 273a1cd1916SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;} 274a1cd1916SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;} 2753e519524SHoward Hinnant 2763e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 2773e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 2783e519524SHoward Hinnant 279a04d2b33SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) 280a04d2b33SHoward Hinnant {__re_ = __re; __im_ = value_type(); return *this;} 2813e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;} 2823e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;} 2833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;} 2843e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;} 2853e519524SHoward Hinnant 2863e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 2873e519524SHoward Hinnant { 2883e519524SHoward Hinnant __re_ = __c.real(); 2893e519524SHoward Hinnant __im_ = __c.imag(); 2903e519524SHoward Hinnant return *this; 2913e519524SHoward Hinnant } 2923e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 2933e519524SHoward Hinnant { 2943e519524SHoward Hinnant __re_ += __c.real(); 2953e519524SHoward Hinnant __im_ += __c.imag(); 2963e519524SHoward Hinnant return *this; 2973e519524SHoward Hinnant } 2983e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 2993e519524SHoward Hinnant { 3003e519524SHoward Hinnant __re_ -= __c.real(); 3013e519524SHoward Hinnant __im_ -= __c.imag(); 3023e519524SHoward Hinnant return *this; 3033e519524SHoward Hinnant } 3043e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 3053e519524SHoward Hinnant { 306a1cd1916SMarshall Clow *this = *this * complex(__c.real(), __c.imag()); 3073e519524SHoward Hinnant return *this; 3083e519524SHoward Hinnant } 3093e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 3103e519524SHoward Hinnant { 311a1cd1916SMarshall Clow *this = *this / complex(__c.real(), __c.imag()); 3123e519524SHoward Hinnant return *this; 3133e519524SHoward Hinnant } 3143e519524SHoward Hinnant}; 3153e519524SHoward Hinnant 316e2f2d1edSEric Fiseliertemplate<> class _LIBCPP_TEMPLATE_VIS complex<double>; 317e2f2d1edSEric Fiseliertemplate<> class _LIBCPP_TEMPLATE_VIS complex<long double>; 3183e519524SHoward Hinnant 3193e519524SHoward Hinnanttemplate<> 320e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS complex<float> 3213e519524SHoward Hinnant{ 3223e519524SHoward Hinnant float __re_; 3233e519524SHoward Hinnant float __im_; 3243e519524SHoward Hinnantpublic: 3253e519524SHoward Hinnant typedef float value_type; 3263e519524SHoward Hinnant 327f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f) 3283e519524SHoward Hinnant : __re_(__re), __im_(__im) {} 329cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 330f4e11de8SHoward Hinnant explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 331cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 332f4e11de8SHoward Hinnant explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 3333e519524SHoward Hinnant 334f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;} 335f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;} 3363e519524SHoward Hinnant 3373e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 3383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 3393e519524SHoward Hinnant 340a04d2b33SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) 341a04d2b33SHoward Hinnant {__re_ = __re; __im_ = value_type(); 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 { 367a1cd1916SMarshall Clow *this = *this * complex(__c.real(), __c.imag()); 3683e519524SHoward Hinnant return *this; 3693e519524SHoward Hinnant } 3703e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 3713e519524SHoward Hinnant { 372a1cd1916SMarshall Clow *this = *this / complex(__c.real(), __c.imag()); 3733e519524SHoward Hinnant return *this; 3743e519524SHoward Hinnant } 3753e519524SHoward Hinnant}; 3763e519524SHoward Hinnant 3773e519524SHoward Hinnanttemplate<> 378e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS complex<double> 3793e519524SHoward Hinnant{ 3803e519524SHoward Hinnant double __re_; 3813e519524SHoward Hinnant double __im_; 3823e519524SHoward Hinnantpublic: 3833e519524SHoward Hinnant typedef double value_type; 3843e519524SHoward Hinnant 385f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0) 3863e519524SHoward Hinnant : __re_(__re), __im_(__im) {} 387cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 388f4e11de8SHoward Hinnant _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 389cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 390f4e11de8SHoward Hinnant explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 3913e519524SHoward Hinnant 392f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;} 393f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;} 3943e519524SHoward Hinnant 3953e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 3963e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 3973e519524SHoward Hinnant 398a04d2b33SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) 399a04d2b33SHoward Hinnant {__re_ = __re; __im_ = value_type(); return *this;} 4003e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;} 4013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;} 4023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;} 4033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;} 4043e519524SHoward Hinnant 4053e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 4063e519524SHoward Hinnant { 4073e519524SHoward Hinnant __re_ = __c.real(); 4083e519524SHoward Hinnant __im_ = __c.imag(); 4093e519524SHoward Hinnant return *this; 4103e519524SHoward Hinnant } 4113e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 4123e519524SHoward Hinnant { 4133e519524SHoward Hinnant __re_ += __c.real(); 4143e519524SHoward Hinnant __im_ += __c.imag(); 4153e519524SHoward Hinnant return *this; 4163e519524SHoward Hinnant } 4173e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 4183e519524SHoward Hinnant { 4193e519524SHoward Hinnant __re_ -= __c.real(); 4203e519524SHoward Hinnant __im_ -= __c.imag(); 4213e519524SHoward Hinnant return *this; 4223e519524SHoward Hinnant } 4233e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 4243e519524SHoward Hinnant { 425a1cd1916SMarshall Clow *this = *this * complex(__c.real(), __c.imag()); 4263e519524SHoward Hinnant return *this; 4273e519524SHoward Hinnant } 4283e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 4293e519524SHoward Hinnant { 430a1cd1916SMarshall Clow *this = *this / complex(__c.real(), __c.imag()); 4313e519524SHoward Hinnant return *this; 4323e519524SHoward Hinnant } 4333e519524SHoward Hinnant}; 4343e519524SHoward Hinnant 4353e519524SHoward Hinnanttemplate<> 436e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS complex<long double> 4373e519524SHoward Hinnant{ 4383e519524SHoward Hinnant long double __re_; 4393e519524SHoward Hinnant long double __im_; 4403e519524SHoward Hinnantpublic: 4413e519524SHoward Hinnant typedef long double value_type; 4423e519524SHoward Hinnant 443f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L) 4443e519524SHoward Hinnant : __re_(__re), __im_(__im) {} 445cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 446f4e11de8SHoward Hinnant _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 447cd31b434SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 448f4e11de8SHoward Hinnant _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 4493e519524SHoward Hinnant 450f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;} 451f4e11de8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;} 4523e519524SHoward Hinnant 4533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 4543e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 4553e519524SHoward Hinnant 456a04d2b33SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) 457a04d2b33SHoward Hinnant {__re_ = __re; __im_ = value_type(); return *this;} 4583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;} 4593e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;} 4603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;} 4613e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; 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 __re_ -= __c.real(); 4783e519524SHoward Hinnant __im_ -= __c.imag(); 4793e519524SHoward Hinnant return *this; 4803e519524SHoward Hinnant } 4813e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 4823e519524SHoward Hinnant { 483a1cd1916SMarshall Clow *this = *this * complex(__c.real(), __c.imag()); 4843e519524SHoward Hinnant return *this; 4853e519524SHoward Hinnant } 4863e519524SHoward Hinnant template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 4873e519524SHoward Hinnant { 488a1cd1916SMarshall Clow *this = *this / complex(__c.real(), __c.imag()); 4893e519524SHoward Hinnant return *this; 4903e519524SHoward Hinnant } 4913e519524SHoward Hinnant}; 4923e519524SHoward Hinnant 493cd31b434SEvgeniy Stepanovinline 494f4e11de8SHoward Hinnant_LIBCPP_CONSTEXPR 4953e519524SHoward Hinnantcomplex<float>::complex(const complex<double>& __c) 4963e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 4973e519524SHoward Hinnant 498cd31b434SEvgeniy Stepanovinline 499f4e11de8SHoward Hinnant_LIBCPP_CONSTEXPR 5003e519524SHoward Hinnantcomplex<float>::complex(const complex<long double>& __c) 5013e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 5023e519524SHoward Hinnant 503cd31b434SEvgeniy Stepanovinline 504f4e11de8SHoward Hinnant_LIBCPP_CONSTEXPR 5053e519524SHoward Hinnantcomplex<double>::complex(const complex<float>& __c) 5063e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 5073e519524SHoward Hinnant 508cd31b434SEvgeniy Stepanovinline 509f4e11de8SHoward Hinnant_LIBCPP_CONSTEXPR 5103e519524SHoward Hinnantcomplex<double>::complex(const complex<long double>& __c) 5113e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 5123e519524SHoward Hinnant 513cd31b434SEvgeniy Stepanovinline 514f4e11de8SHoward Hinnant_LIBCPP_CONSTEXPR 5153e519524SHoward Hinnantcomplex<long double>::complex(const complex<float>& __c) 5163e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 5173e519524SHoward Hinnant 518cd31b434SEvgeniy Stepanovinline 519f4e11de8SHoward Hinnant_LIBCPP_CONSTEXPR 5203e519524SHoward Hinnantcomplex<long double>::complex(const complex<double>& __c) 5213e519524SHoward Hinnant : __re_(__c.real()), __im_(__c.imag()) {} 5223e519524SHoward Hinnant 5233e519524SHoward Hinnant// 26.3.6 operators: 5243e519524SHoward Hinnant 5253e519524SHoward Hinnanttemplate<class _Tp> 5263e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5273e519524SHoward Hinnantcomplex<_Tp> 5283e519524SHoward Hinnantoperator+(const complex<_Tp>& __x, const complex<_Tp>& __y) 5293e519524SHoward Hinnant{ 5303e519524SHoward Hinnant complex<_Tp> __t(__x); 5313e519524SHoward Hinnant __t += __y; 5323e519524SHoward Hinnant return __t; 5333e519524SHoward Hinnant} 5343e519524SHoward Hinnant 5353e519524SHoward Hinnanttemplate<class _Tp> 5363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5373e519524SHoward Hinnantcomplex<_Tp> 5383e519524SHoward Hinnantoperator+(const complex<_Tp>& __x, const _Tp& __y) 5393e519524SHoward Hinnant{ 5403e519524SHoward Hinnant complex<_Tp> __t(__x); 5413e519524SHoward Hinnant __t += __y; 5423e519524SHoward Hinnant return __t; 5433e519524SHoward Hinnant} 5443e519524SHoward Hinnant 5453e519524SHoward Hinnanttemplate<class _Tp> 5463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5473e519524SHoward Hinnantcomplex<_Tp> 5483e519524SHoward Hinnantoperator+(const _Tp& __x, const complex<_Tp>& __y) 5493e519524SHoward Hinnant{ 5503e519524SHoward Hinnant complex<_Tp> __t(__y); 5513e519524SHoward Hinnant __t += __x; 5523e519524SHoward Hinnant return __t; 5533e519524SHoward Hinnant} 5543e519524SHoward Hinnant 5553e519524SHoward Hinnanttemplate<class _Tp> 5563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5573e519524SHoward Hinnantcomplex<_Tp> 5583e519524SHoward Hinnantoperator-(const complex<_Tp>& __x, const complex<_Tp>& __y) 5593e519524SHoward Hinnant{ 5603e519524SHoward Hinnant complex<_Tp> __t(__x); 5613e519524SHoward Hinnant __t -= __y; 5623e519524SHoward Hinnant return __t; 5633e519524SHoward Hinnant} 5643e519524SHoward Hinnant 5653e519524SHoward Hinnanttemplate<class _Tp> 5663e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5673e519524SHoward Hinnantcomplex<_Tp> 5683e519524SHoward Hinnantoperator-(const complex<_Tp>& __x, const _Tp& __y) 5693e519524SHoward Hinnant{ 5703e519524SHoward Hinnant complex<_Tp> __t(__x); 5713e519524SHoward Hinnant __t -= __y; 5723e519524SHoward Hinnant return __t; 5733e519524SHoward Hinnant} 5743e519524SHoward Hinnant 5753e519524SHoward Hinnanttemplate<class _Tp> 5763e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5773e519524SHoward Hinnantcomplex<_Tp> 5783e519524SHoward Hinnantoperator-(const _Tp& __x, const complex<_Tp>& __y) 5793e519524SHoward Hinnant{ 5803e519524SHoward Hinnant complex<_Tp> __t(-__y); 5813e519524SHoward Hinnant __t += __x; 5823e519524SHoward Hinnant return __t; 5833e519524SHoward Hinnant} 5843e519524SHoward Hinnant 5853e519524SHoward Hinnanttemplate<class _Tp> 5863e519524SHoward Hinnantcomplex<_Tp> 5873e519524SHoward Hinnantoperator*(const complex<_Tp>& __z, const complex<_Tp>& __w) 5883e519524SHoward Hinnant{ 5893e519524SHoward Hinnant _Tp __a = __z.real(); 5903e519524SHoward Hinnant _Tp __b = __z.imag(); 5913e519524SHoward Hinnant _Tp __c = __w.real(); 5923e519524SHoward Hinnant _Tp __d = __w.imag(); 5933e519524SHoward Hinnant _Tp __ac = __a * __c; 5943e519524SHoward Hinnant _Tp __bd = __b * __d; 5953e519524SHoward Hinnant _Tp __ad = __a * __d; 5963e519524SHoward Hinnant _Tp __bc = __b * __c; 5973e519524SHoward Hinnant _Tp __x = __ac - __bd; 5983e519524SHoward Hinnant _Tp __y = __ad + __bc; 59966631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 6003e519524SHoward Hinnant { 6013e519524SHoward Hinnant bool __recalc = false; 60266631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) 6033e519524SHoward Hinnant { 60466631a12SDuncan P. N. Exon Smith __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 60566631a12SDuncan P. N. Exon Smith __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 60666631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__c)) 6073e519524SHoward Hinnant __c = copysign(_Tp(0), __c); 60866631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__d)) 6093e519524SHoward Hinnant __d = copysign(_Tp(0), __d); 6103e519524SHoward Hinnant __recalc = true; 6113e519524SHoward Hinnant } 61266631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__c) || __libcpp_isinf_or_builtin(__d)) 6133e519524SHoward Hinnant { 61466631a12SDuncan P. N. Exon Smith __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 61566631a12SDuncan P. N. Exon Smith __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 61666631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__a)) 6173e519524SHoward Hinnant __a = copysign(_Tp(0), __a); 61866631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__b)) 6193e519524SHoward Hinnant __b = copysign(_Tp(0), __b); 6203e519524SHoward Hinnant __recalc = true; 6213e519524SHoward Hinnant } 62266631a12SDuncan P. N. Exon Smith if (!__recalc && (__libcpp_isinf_or_builtin(__ac) || __libcpp_isinf_or_builtin(__bd) || 62366631a12SDuncan P. N. Exon Smith __libcpp_isinf_or_builtin(__ad) || __libcpp_isinf_or_builtin(__bc))) 6243e519524SHoward Hinnant { 62566631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__a)) 6263e519524SHoward Hinnant __a = copysign(_Tp(0), __a); 62766631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__b)) 6283e519524SHoward Hinnant __b = copysign(_Tp(0), __b); 62966631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__c)) 6303e519524SHoward Hinnant __c = copysign(_Tp(0), __c); 63166631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__d)) 6323e519524SHoward Hinnant __d = copysign(_Tp(0), __d); 6333e519524SHoward Hinnant __recalc = true; 6343e519524SHoward Hinnant } 6353e519524SHoward Hinnant if (__recalc) 6363e519524SHoward Hinnant { 6373e519524SHoward Hinnant __x = _Tp(INFINITY) * (__a * __c - __b * __d); 6383e519524SHoward Hinnant __y = _Tp(INFINITY) * (__a * __d + __b * __c); 6393e519524SHoward Hinnant } 6403e519524SHoward Hinnant } 6413e519524SHoward Hinnant return complex<_Tp>(__x, __y); 6423e519524SHoward Hinnant} 6433e519524SHoward Hinnant 6443e519524SHoward Hinnanttemplate<class _Tp> 6453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6463e519524SHoward Hinnantcomplex<_Tp> 6473e519524SHoward Hinnantoperator*(const complex<_Tp>& __x, const _Tp& __y) 6483e519524SHoward Hinnant{ 6493e519524SHoward Hinnant complex<_Tp> __t(__x); 6503e519524SHoward Hinnant __t *= __y; 6513e519524SHoward Hinnant return __t; 6523e519524SHoward Hinnant} 6533e519524SHoward Hinnant 6543e519524SHoward Hinnanttemplate<class _Tp> 6553e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6563e519524SHoward Hinnantcomplex<_Tp> 6573e519524SHoward Hinnantoperator*(const _Tp& __x, const complex<_Tp>& __y) 6583e519524SHoward Hinnant{ 6593e519524SHoward Hinnant complex<_Tp> __t(__y); 6603e519524SHoward Hinnant __t *= __x; 6613e519524SHoward Hinnant return __t; 6623e519524SHoward Hinnant} 6633e519524SHoward Hinnant 6643e519524SHoward Hinnanttemplate<class _Tp> 6653e519524SHoward Hinnantcomplex<_Tp> 6663e519524SHoward Hinnantoperator/(const complex<_Tp>& __z, const complex<_Tp>& __w) 6673e519524SHoward Hinnant{ 6683e519524SHoward Hinnant int __ilogbw = 0; 6693e519524SHoward Hinnant _Tp __a = __z.real(); 6703e519524SHoward Hinnant _Tp __b = __z.imag(); 6713e519524SHoward Hinnant _Tp __c = __w.real(); 6723e519524SHoward Hinnant _Tp __d = __w.imag(); 6733e519524SHoward Hinnant _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); 67466631a12SDuncan P. N. Exon Smith if (__libcpp_isfinite_or_builtin(__logbw)) 6753e519524SHoward Hinnant { 6763e519524SHoward Hinnant __ilogbw = static_cast<int>(__logbw); 6773e519524SHoward Hinnant __c = scalbn(__c, -__ilogbw); 6783e519524SHoward Hinnant __d = scalbn(__d, -__ilogbw); 6793e519524SHoward Hinnant } 6803e519524SHoward Hinnant _Tp __denom = __c * __c + __d * __d; 6813e519524SHoward Hinnant _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); 6823e519524SHoward Hinnant _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); 68366631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 6843e519524SHoward Hinnant { 68566631a12SDuncan P. N. Exon Smith if ((__denom == _Tp(0)) && (!__libcpp_isnan_or_builtin(__a) || !__libcpp_isnan_or_builtin(__b))) 6863e519524SHoward Hinnant { 6873e519524SHoward Hinnant __x = copysign(_Tp(INFINITY), __c) * __a; 6883e519524SHoward Hinnant __y = copysign(_Tp(INFINITY), __c) * __b; 6893e519524SHoward Hinnant } 69066631a12SDuncan P. N. Exon Smith else if ((__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) && __libcpp_isfinite_or_builtin(__c) && __libcpp_isfinite_or_builtin(__d)) 6913e519524SHoward Hinnant { 69266631a12SDuncan P. N. Exon Smith __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 69366631a12SDuncan P. N. Exon Smith __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 6943e519524SHoward Hinnant __x = _Tp(INFINITY) * (__a * __c + __b * __d); 6953e519524SHoward Hinnant __y = _Tp(INFINITY) * (__b * __c - __a * __d); 6963e519524SHoward Hinnant } 69766631a12SDuncan P. N. Exon Smith else if (__libcpp_isinf_or_builtin(__logbw) && __logbw > _Tp(0) && __libcpp_isfinite_or_builtin(__a) && __libcpp_isfinite_or_builtin(__b)) 6983e519524SHoward Hinnant { 69966631a12SDuncan P. N. Exon Smith __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 70066631a12SDuncan P. N. Exon Smith __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 7013e519524SHoward Hinnant __x = _Tp(0) * (__a * __c + __b * __d); 7023e519524SHoward Hinnant __y = _Tp(0) * (__b * __c - __a * __d); 7033e519524SHoward Hinnant } 7043e519524SHoward Hinnant } 7053e519524SHoward Hinnant return complex<_Tp>(__x, __y); 7063e519524SHoward Hinnant} 7073e519524SHoward Hinnant 7083e519524SHoward Hinnanttemplate<class _Tp> 7093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 7103e519524SHoward Hinnantcomplex<_Tp> 7113e519524SHoward Hinnantoperator/(const complex<_Tp>& __x, const _Tp& __y) 7123e519524SHoward Hinnant{ 7133e519524SHoward Hinnant return complex<_Tp>(__x.real() / __y, __x.imag() / __y); 7143e519524SHoward Hinnant} 7153e519524SHoward Hinnant 7163e519524SHoward Hinnanttemplate<class _Tp> 7173e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 7183e519524SHoward Hinnantcomplex<_Tp> 7193e519524SHoward Hinnantoperator/(const _Tp& __x, const complex<_Tp>& __y) 7203e519524SHoward Hinnant{ 7213e519524SHoward Hinnant complex<_Tp> __t(__x); 7223e519524SHoward Hinnant __t /= __y; 7233e519524SHoward Hinnant return __t; 7243e519524SHoward Hinnant} 7253e519524SHoward Hinnant 7263e519524SHoward Hinnanttemplate<class _Tp> 7273e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 7283e519524SHoward Hinnantcomplex<_Tp> 7293e519524SHoward Hinnantoperator+(const complex<_Tp>& __x) 7303e519524SHoward Hinnant{ 7313e519524SHoward Hinnant return __x; 7323e519524SHoward Hinnant} 7333e519524SHoward Hinnant 7343e519524SHoward Hinnanttemplate<class _Tp> 7353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 7363e519524SHoward Hinnantcomplex<_Tp> 7373e519524SHoward Hinnantoperator-(const complex<_Tp>& __x) 7383e519524SHoward Hinnant{ 7393e519524SHoward Hinnant return complex<_Tp>(-__x.real(), -__x.imag()); 7403e519524SHoward Hinnant} 7413e519524SHoward Hinnant 7423e519524SHoward Hinnanttemplate<class _Tp> 743a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7443e519524SHoward Hinnantbool 7453e519524SHoward Hinnantoperator==(const complex<_Tp>& __x, const complex<_Tp>& __y) 7463e519524SHoward Hinnant{ 7473e519524SHoward Hinnant return __x.real() == __y.real() && __x.imag() == __y.imag(); 7483e519524SHoward Hinnant} 7493e519524SHoward Hinnant 7503e519524SHoward Hinnanttemplate<class _Tp> 751a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7523e519524SHoward Hinnantbool 7533e519524SHoward Hinnantoperator==(const complex<_Tp>& __x, const _Tp& __y) 7543e519524SHoward Hinnant{ 7553e519524SHoward Hinnant return __x.real() == __y && __x.imag() == 0; 7563e519524SHoward Hinnant} 7573e519524SHoward Hinnant 7583e519524SHoward Hinnanttemplate<class _Tp> 759a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7603e519524SHoward Hinnantbool 7613e519524SHoward Hinnantoperator==(const _Tp& __x, const complex<_Tp>& __y) 7623e519524SHoward Hinnant{ 7633e519524SHoward Hinnant return __x == __y.real() && 0 == __y.imag(); 7643e519524SHoward Hinnant} 7653e519524SHoward Hinnant 7663e519524SHoward Hinnanttemplate<class _Tp> 767a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7683e519524SHoward Hinnantbool 7693e519524SHoward Hinnantoperator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) 7703e519524SHoward Hinnant{ 7713e519524SHoward Hinnant return !(__x == __y); 7723e519524SHoward Hinnant} 7733e519524SHoward Hinnant 7743e519524SHoward Hinnanttemplate<class _Tp> 775a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7763e519524SHoward Hinnantbool 7773e519524SHoward Hinnantoperator!=(const complex<_Tp>& __x, const _Tp& __y) 7783e519524SHoward Hinnant{ 7793e519524SHoward Hinnant return !(__x == __y); 7803e519524SHoward Hinnant} 7813e519524SHoward Hinnant 7823e519524SHoward Hinnanttemplate<class _Tp> 783a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7843e519524SHoward Hinnantbool 7853e519524SHoward Hinnantoperator!=(const _Tp& __x, const complex<_Tp>& __y) 7863e519524SHoward Hinnant{ 7873e519524SHoward Hinnant return !(__x == __y); 7883e519524SHoward Hinnant} 7893e519524SHoward Hinnant 7903e519524SHoward Hinnant// 26.3.7 values: 7913e519524SHoward Hinnant 792b11642bfSEric Fiseliertemplate <class _Tp, bool = is_integral<_Tp>::value, 793b11642bfSEric Fiselier bool = is_floating_point<_Tp>::value 794b11642bfSEric Fiselier > 795b11642bfSEric Fiselierstruct __libcpp_complex_overload_traits {}; 796b11642bfSEric Fiselier 797b11642bfSEric Fiselier// Integral Types 798b11642bfSEric Fiseliertemplate <class _Tp> 799b11642bfSEric Fiselierstruct __libcpp_complex_overload_traits<_Tp, true, false> 800b11642bfSEric Fiselier{ 801b11642bfSEric Fiselier typedef double _ValueType; 802b11642bfSEric Fiselier typedef complex<double> _ComplexType; 803b11642bfSEric Fiselier}; 804b11642bfSEric Fiselier 805b11642bfSEric Fiselier// Floating point types 806b11642bfSEric Fiseliertemplate <class _Tp> 807b11642bfSEric Fiselierstruct __libcpp_complex_overload_traits<_Tp, false, true> 808b11642bfSEric Fiselier{ 809b11642bfSEric Fiselier typedef _Tp _ValueType; 810b11642bfSEric Fiselier typedef complex<_Tp> _ComplexType; 811b11642bfSEric Fiselier}; 812b11642bfSEric Fiselier 8133e519524SHoward Hinnant// real 8143e519524SHoward Hinnant 8153e519524SHoward Hinnanttemplate<class _Tp> 816a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 8173e519524SHoward Hinnant_Tp 8183e519524SHoward Hinnantreal(const complex<_Tp>& __c) 8193e519524SHoward Hinnant{ 8203e519524SHoward Hinnant return __c.real(); 8213e519524SHoward Hinnant} 8223e519524SHoward Hinnant 8233e519524SHoward Hinnanttemplate <class _Tp> 824a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 825b11642bfSEric Fiseliertypename __libcpp_complex_overload_traits<_Tp>::_ValueType 8263e519524SHoward Hinnantreal(_Tp __re) 8273e519524SHoward Hinnant{ 8283e519524SHoward Hinnant return __re; 8293e519524SHoward Hinnant} 8303e519524SHoward Hinnant 8313e519524SHoward Hinnant// imag 8323e519524SHoward Hinnant 8333e519524SHoward Hinnanttemplate<class _Tp> 834a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 8353e519524SHoward Hinnant_Tp 8363e519524SHoward Hinnantimag(const complex<_Tp>& __c) 8373e519524SHoward Hinnant{ 8383e519524SHoward Hinnant return __c.imag(); 8393e519524SHoward Hinnant} 8403e519524SHoward Hinnant 8413e519524SHoward Hinnanttemplate <class _Tp> 842a1cd1916SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 843b11642bfSEric Fiseliertypename __libcpp_complex_overload_traits<_Tp>::_ValueType 844fd838227SEric Fiselierimag(_Tp) 8453e519524SHoward Hinnant{ 8463e519524SHoward Hinnant return 0; 8473e519524SHoward Hinnant} 8483e519524SHoward Hinnant 8493e519524SHoward Hinnant// abs 8503e519524SHoward Hinnant 8513e519524SHoward Hinnanttemplate<class _Tp> 8523e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 8533e519524SHoward Hinnant_Tp 8543e519524SHoward Hinnantabs(const complex<_Tp>& __c) 8553e519524SHoward Hinnant{ 8563e519524SHoward Hinnant return hypot(__c.real(), __c.imag()); 8573e519524SHoward Hinnant} 8583e519524SHoward Hinnant 8593e519524SHoward Hinnant// arg 8603e519524SHoward Hinnant 8613e519524SHoward Hinnanttemplate<class _Tp> 8623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 8633e519524SHoward Hinnant_Tp 8643e519524SHoward Hinnantarg(const complex<_Tp>& __c) 8653e519524SHoward Hinnant{ 8663e519524SHoward Hinnant return atan2(__c.imag(), __c.real()); 8673e519524SHoward Hinnant} 8683e519524SHoward Hinnant 869b11642bfSEric Fiseliertemplate <class _Tp> 8703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 871b11642bfSEric Fiseliertypename enable_if< 872b11642bfSEric Fiselier is_same<_Tp, long double>::value, 8733e519524SHoward Hinnant long double 874b11642bfSEric Fiselier>::type 875b11642bfSEric Fiselierarg(_Tp __re) 8763e519524SHoward Hinnant{ 8773e519524SHoward Hinnant return atan2l(0.L, __re); 8783e519524SHoward Hinnant} 8793e519524SHoward Hinnant 8803e519524SHoward Hinnanttemplate<class _Tp> 8813e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 8823e519524SHoward Hinnanttypename enable_if 8833e519524SHoward Hinnant< 884b11642bfSEric Fiselier is_integral<_Tp>::value || is_same<_Tp, double>::value, 8853e519524SHoward Hinnant double 8863e519524SHoward Hinnant>::type 8873e519524SHoward Hinnantarg(_Tp __re) 8883e519524SHoward Hinnant{ 8893e519524SHoward Hinnant return atan2(0., __re); 8903e519524SHoward Hinnant} 8913e519524SHoward Hinnant 892b11642bfSEric Fiseliertemplate <class _Tp> 8933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 894b11642bfSEric Fiseliertypename enable_if< 895b11642bfSEric Fiselier is_same<_Tp, float>::value, 8963e519524SHoward Hinnant float 897b11642bfSEric Fiselier>::type 898b11642bfSEric Fiselierarg(_Tp __re) 8993e519524SHoward Hinnant{ 9003e519524SHoward Hinnant return atan2f(0.F, __re); 9013e519524SHoward Hinnant} 9023e519524SHoward Hinnant 9033e519524SHoward Hinnant// norm 9043e519524SHoward Hinnant 9053e519524SHoward Hinnanttemplate<class _Tp> 9063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9073e519524SHoward Hinnant_Tp 9083e519524SHoward Hinnantnorm(const complex<_Tp>& __c) 9093e519524SHoward Hinnant{ 91066631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__c.real())) 9113e519524SHoward Hinnant return abs(__c.real()); 91266631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__c.imag())) 9133e519524SHoward Hinnant return abs(__c.imag()); 9143e519524SHoward Hinnant return __c.real() * __c.real() + __c.imag() * __c.imag(); 9153e519524SHoward Hinnant} 9163e519524SHoward Hinnant 9173e519524SHoward Hinnanttemplate <class _Tp> 9183e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 919b11642bfSEric Fiseliertypename __libcpp_complex_overload_traits<_Tp>::_ValueType 9203e519524SHoward Hinnantnorm(_Tp __re) 9213e519524SHoward Hinnant{ 922b11642bfSEric Fiselier typedef typename __libcpp_complex_overload_traits<_Tp>::_ValueType _ValueType; 923b11642bfSEric Fiselier return static_cast<_ValueType>(__re) * __re; 9243e519524SHoward Hinnant} 9253e519524SHoward Hinnant 9263e519524SHoward Hinnant// conj 9273e519524SHoward Hinnant 9283e519524SHoward Hinnanttemplate<class _Tp> 9293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9303e519524SHoward Hinnantcomplex<_Tp> 9313e519524SHoward Hinnantconj(const complex<_Tp>& __c) 9323e519524SHoward Hinnant{ 9333e519524SHoward Hinnant return complex<_Tp>(__c.real(), -__c.imag()); 9343e519524SHoward Hinnant} 9353e519524SHoward Hinnant 9363e519524SHoward Hinnanttemplate <class _Tp> 9373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 938b11642bfSEric Fiseliertypename __libcpp_complex_overload_traits<_Tp>::_ComplexType 9393e519524SHoward Hinnantconj(_Tp __re) 9403e519524SHoward Hinnant{ 941b11642bfSEric Fiselier typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 942b11642bfSEric Fiselier return _ComplexType(__re); 9433e519524SHoward Hinnant} 9443e519524SHoward Hinnant 945b11642bfSEric Fiselier 9463e519524SHoward Hinnant 9473e519524SHoward Hinnant// proj 9483e519524SHoward Hinnant 9493e519524SHoward Hinnanttemplate<class _Tp> 9503e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9513e519524SHoward Hinnantcomplex<_Tp> 9523e519524SHoward Hinnantproj(const complex<_Tp>& __c) 9533e519524SHoward Hinnant{ 954d586f92cSArthur O'Dwyer complex<_Tp> __r = __c; 95566631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__c.real()) || __libcpp_isinf_or_builtin(__c.imag())) 9563e519524SHoward Hinnant __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag())); 9573e519524SHoward Hinnant return __r; 9583e519524SHoward Hinnant} 9593e519524SHoward Hinnant 960b11642bfSEric Fiseliertemplate <class _Tp> 9613e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 962b11642bfSEric Fiseliertypename enable_if 963b11642bfSEric Fiselier< 964b11642bfSEric Fiselier is_floating_point<_Tp>::value, 965b11642bfSEric Fiselier typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 966b11642bfSEric Fiselier>::type 967b11642bfSEric Fiselierproj(_Tp __re) 9683e519524SHoward Hinnant{ 96966631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__re)) 9703e519524SHoward Hinnant __re = abs(__re); 971b11642bfSEric Fiselier return complex<_Tp>(__re); 9723e519524SHoward Hinnant} 9733e519524SHoward Hinnant 9743e519524SHoward Hinnanttemplate <class _Tp> 9753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9763e519524SHoward Hinnanttypename enable_if 9773e519524SHoward Hinnant< 9783e519524SHoward Hinnant is_integral<_Tp>::value, 979b11642bfSEric Fiselier typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 9803e519524SHoward Hinnant>::type 9813e519524SHoward Hinnantproj(_Tp __re) 9823e519524SHoward Hinnant{ 983b11642bfSEric Fiselier typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 984b11642bfSEric Fiselier return _ComplexType(__re); 9853e519524SHoward Hinnant} 9863e519524SHoward Hinnant 9873e519524SHoward Hinnant// polar 9883e519524SHoward Hinnant 9893e519524SHoward Hinnanttemplate<class _Tp> 9903e519524SHoward Hinnantcomplex<_Tp> 9910551d83eSMarshall Clowpolar(const _Tp& __rho, const _Tp& __theta = _Tp()) 9923e519524SHoward Hinnant{ 99366631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__rho) || signbit(__rho)) 9943e519524SHoward Hinnant return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 99566631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__theta)) 9963e519524SHoward Hinnant { 99766631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__rho)) 9983e519524SHoward Hinnant return complex<_Tp>(__rho, __theta); 9993e519524SHoward Hinnant return complex<_Tp>(__theta, __theta); 10003e519524SHoward Hinnant } 100166631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__theta)) 10023e519524SHoward Hinnant { 100366631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__rho)) 10043e519524SHoward Hinnant return complex<_Tp>(__rho, _Tp(NAN)); 10053e519524SHoward Hinnant return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 10063e519524SHoward Hinnant } 10073e519524SHoward Hinnant _Tp __x = __rho * cos(__theta); 100866631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x)) 10093e519524SHoward Hinnant __x = 0; 10103e519524SHoward Hinnant _Tp __y = __rho * sin(__theta); 101166631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__y)) 10123e519524SHoward Hinnant __y = 0; 10133e519524SHoward Hinnant return complex<_Tp>(__x, __y); 10143e519524SHoward Hinnant} 10153e519524SHoward Hinnant 10163e519524SHoward Hinnant// log 10173e519524SHoward Hinnant 10183e519524SHoward Hinnanttemplate<class _Tp> 10193e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10203e519524SHoward Hinnantcomplex<_Tp> 10213e519524SHoward Hinnantlog(const complex<_Tp>& __x) 10223e519524SHoward Hinnant{ 10233e519524SHoward Hinnant return complex<_Tp>(log(abs(__x)), arg(__x)); 10243e519524SHoward Hinnant} 10253e519524SHoward Hinnant 10263e519524SHoward Hinnant// log10 10273e519524SHoward Hinnant 10283e519524SHoward Hinnanttemplate<class _Tp> 10293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10303e519524SHoward Hinnantcomplex<_Tp> 10313e519524SHoward Hinnantlog10(const complex<_Tp>& __x) 10323e519524SHoward Hinnant{ 10333e519524SHoward Hinnant return log(__x) / log(_Tp(10)); 10343e519524SHoward Hinnant} 10353e519524SHoward Hinnant 10363e519524SHoward Hinnant// sqrt 10373e519524SHoward Hinnant 10383e519524SHoward Hinnanttemplate<class _Tp> 10393e519524SHoward Hinnantcomplex<_Tp> 10403e519524SHoward Hinnantsqrt(const complex<_Tp>& __x) 10413e519524SHoward Hinnant{ 104266631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 10433e519524SHoward Hinnant return complex<_Tp>(_Tp(INFINITY), __x.imag()); 104466631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 10453e519524SHoward Hinnant { 10463e519524SHoward Hinnant if (__x.real() > _Tp(0)) 104766631a12SDuncan P. N. Exon Smith return complex<_Tp>(__x.real(), __libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag())); 104866631a12SDuncan P. N. Exon Smith return complex<_Tp>(__libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag())); 10493e519524SHoward Hinnant } 10503e519524SHoward Hinnant return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); 10513e519524SHoward Hinnant} 10523e519524SHoward Hinnant 10533e519524SHoward Hinnant// exp 10543e519524SHoward Hinnant 10553e519524SHoward Hinnanttemplate<class _Tp> 10563e519524SHoward Hinnantcomplex<_Tp> 10573e519524SHoward Hinnantexp(const complex<_Tp>& __x) 10583e519524SHoward Hinnant{ 10593e519524SHoward Hinnant _Tp __i = __x.imag(); 1060f21c2473SXiang Gao if (__i == 0) { 1061f21c2473SXiang Gao return complex<_Tp>(exp(__x.real()), copysign(_Tp(0), __x.imag())); 1062f21c2473SXiang Gao } 106366631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 10643e519524SHoward Hinnant { 10653e519524SHoward Hinnant if (__x.real() < _Tp(0)) 10663e519524SHoward Hinnant { 106766631a12SDuncan P. N. Exon Smith if (!__libcpp_isfinite_or_builtin(__i)) 10683e519524SHoward Hinnant __i = _Tp(1); 10693e519524SHoward Hinnant } 107066631a12SDuncan P. N. Exon Smith else if (__i == 0 || !__libcpp_isfinite_or_builtin(__i)) 10713e519524SHoward Hinnant { 107266631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__i)) 10733e519524SHoward Hinnant __i = _Tp(NAN); 10743e519524SHoward Hinnant return complex<_Tp>(__x.real(), __i); 10753e519524SHoward Hinnant } 10763e519524SHoward Hinnant } 10773e519524SHoward Hinnant _Tp __e = exp(__x.real()); 10783e519524SHoward Hinnant return complex<_Tp>(__e * cos(__i), __e * sin(__i)); 10793e519524SHoward Hinnant} 10803e519524SHoward Hinnant 10813e519524SHoward Hinnant// pow 10823e519524SHoward Hinnant 10833e519524SHoward Hinnanttemplate<class _Tp> 10843e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10853e519524SHoward Hinnantcomplex<_Tp> 10863e519524SHoward Hinnantpow(const complex<_Tp>& __x, const complex<_Tp>& __y) 10873e519524SHoward Hinnant{ 10883e519524SHoward Hinnant return exp(__y * log(__x)); 10893e519524SHoward Hinnant} 10903e519524SHoward Hinnant 10913e519524SHoward Hinnanttemplate<class _Tp, class _Up> 10923e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10933e519524SHoward Hinnantcomplex<typename __promote<_Tp, _Up>::type> 10943e519524SHoward Hinnantpow(const complex<_Tp>& __x, const complex<_Up>& __y) 10953e519524SHoward Hinnant{ 10963e519524SHoward Hinnant typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1097ce48a113SHoward Hinnant return _VSTD::pow(result_type(__x), result_type(__y)); 10983e519524SHoward Hinnant} 10993e519524SHoward Hinnant 11003e519524SHoward Hinnanttemplate<class _Tp, class _Up> 11013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11023e519524SHoward Hinnanttypename enable_if 11033e519524SHoward Hinnant< 11043e519524SHoward Hinnant is_arithmetic<_Up>::value, 11053e519524SHoward Hinnant complex<typename __promote<_Tp, _Up>::type> 11063e519524SHoward Hinnant>::type 11073e519524SHoward Hinnantpow(const complex<_Tp>& __x, const _Up& __y) 11083e519524SHoward Hinnant{ 11093e519524SHoward Hinnant typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1110ce48a113SHoward Hinnant return _VSTD::pow(result_type(__x), result_type(__y)); 11113e519524SHoward Hinnant} 11123e519524SHoward Hinnant 11133e519524SHoward Hinnanttemplate<class _Tp, class _Up> 11143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11153e519524SHoward Hinnanttypename enable_if 11163e519524SHoward Hinnant< 11173e519524SHoward Hinnant is_arithmetic<_Tp>::value, 11183e519524SHoward Hinnant complex<typename __promote<_Tp, _Up>::type> 11193e519524SHoward Hinnant>::type 11203e519524SHoward Hinnantpow(const _Tp& __x, const complex<_Up>& __y) 11213e519524SHoward Hinnant{ 11223e519524SHoward Hinnant typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1123ce48a113SHoward Hinnant return _VSTD::pow(result_type(__x), result_type(__y)); 11243e519524SHoward Hinnant} 11253e519524SHoward Hinnant 1126477b5f68SMikhail Maltsev// __sqr, computes pow(x, 2) 1127477b5f68SMikhail Maltsev 1128477b5f68SMikhail Maltsevtemplate<class _Tp> 1129477b5f68SMikhail Maltsevinline _LIBCPP_INLINE_VISIBILITY 1130477b5f68SMikhail Maltsevcomplex<_Tp> 1131477b5f68SMikhail Maltsev__sqr(const complex<_Tp>& __x) 1132477b5f68SMikhail Maltsev{ 1133477b5f68SMikhail Maltsev return complex<_Tp>((__x.real() - __x.imag()) * (__x.real() + __x.imag()), 1134477b5f68SMikhail Maltsev _Tp(2) * __x.real() * __x.imag()); 1135477b5f68SMikhail Maltsev} 1136477b5f68SMikhail Maltsev 11373e519524SHoward Hinnant// asinh 11383e519524SHoward Hinnant 11393e519524SHoward Hinnanttemplate<class _Tp> 11403e519524SHoward Hinnantcomplex<_Tp> 11413e519524SHoward Hinnantasinh(const complex<_Tp>& __x) 11423e519524SHoward Hinnant{ 11433e519524SHoward Hinnant const _Tp __pi(atan2(+0., -0.)); 114466631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 11453e519524SHoward Hinnant { 114666631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.imag())) 11473e519524SHoward Hinnant return __x; 114866631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 11493e519524SHoward Hinnant return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 11503e519524SHoward Hinnant return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 11513e519524SHoward Hinnant } 115266631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.real())) 11533e519524SHoward Hinnant { 115466631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 11553e519524SHoward Hinnant return complex<_Tp>(__x.imag(), __x.real()); 11563e519524SHoward Hinnant if (__x.imag() == 0) 11573e519524SHoward Hinnant return __x; 11583e519524SHoward Hinnant return complex<_Tp>(__x.real(), __x.real()); 11593e519524SHoward Hinnant } 116066631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 11613e519524SHoward Hinnant return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1162477b5f68SMikhail Maltsev complex<_Tp> __z = log(__x + sqrt(__sqr(__x) + _Tp(1))); 11633e519524SHoward Hinnant return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 11643e519524SHoward Hinnant} 11653e519524SHoward Hinnant 11663e519524SHoward Hinnant// acosh 11673e519524SHoward Hinnant 11683e519524SHoward Hinnanttemplate<class _Tp> 11693e519524SHoward Hinnantcomplex<_Tp> 11703e519524SHoward Hinnantacosh(const complex<_Tp>& __x) 11713e519524SHoward Hinnant{ 11723e519524SHoward Hinnant const _Tp __pi(atan2(+0., -0.)); 117366631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 11743e519524SHoward Hinnant { 117566631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.imag())) 11763e519524SHoward Hinnant return complex<_Tp>(abs(__x.real()), __x.imag()); 117766631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 1178119703f9SHoward Hinnant { 11793e519524SHoward Hinnant if (__x.real() > 0) 11803e519524SHoward Hinnant return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 11813e519524SHoward Hinnant else 11823e519524SHoward Hinnant return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag())); 1183119703f9SHoward Hinnant } 11843e519524SHoward Hinnant if (__x.real() < 0) 11853e519524SHoward Hinnant return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag())); 11863e519524SHoward Hinnant return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 11873e519524SHoward Hinnant } 118866631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.real())) 11893e519524SHoward Hinnant { 119066631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 11913e519524SHoward Hinnant return complex<_Tp>(abs(__x.imag()), __x.real()); 11923e519524SHoward Hinnant return complex<_Tp>(__x.real(), __x.real()); 11933e519524SHoward Hinnant } 119466631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 11953e519524SHoward Hinnant return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag())); 1196477b5f68SMikhail Maltsev complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 11973e519524SHoward Hinnant return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag())); 11983e519524SHoward Hinnant} 11993e519524SHoward Hinnant 12003e519524SHoward Hinnant// atanh 12013e519524SHoward Hinnant 12023e519524SHoward Hinnanttemplate<class _Tp> 12033e519524SHoward Hinnantcomplex<_Tp> 12043e519524SHoward Hinnantatanh(const complex<_Tp>& __x) 12053e519524SHoward Hinnant{ 12063e519524SHoward Hinnant const _Tp __pi(atan2(+0., -0.)); 120766631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 12083e519524SHoward Hinnant { 12093e519524SHoward Hinnant return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 12103e519524SHoward Hinnant } 121166631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.imag())) 12123e519524SHoward Hinnant { 121366631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real()) || __x.real() == 0) 12143e519524SHoward Hinnant return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag()); 12153e519524SHoward Hinnant return complex<_Tp>(__x.imag(), __x.imag()); 12163e519524SHoward Hinnant } 121766631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.real())) 12183e519524SHoward Hinnant { 12193e519524SHoward Hinnant return complex<_Tp>(__x.real(), __x.real()); 12203e519524SHoward Hinnant } 122166631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 12223e519524SHoward Hinnant { 12233e519524SHoward Hinnant return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 12243e519524SHoward Hinnant } 12253e519524SHoward Hinnant if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0)) 12263e519524SHoward Hinnant { 12273e519524SHoward Hinnant return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag())); 12283e519524SHoward Hinnant } 12293e519524SHoward Hinnant complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2); 12303e519524SHoward Hinnant return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 12313e519524SHoward Hinnant} 12323e519524SHoward Hinnant 12333e519524SHoward Hinnant// sinh 12343e519524SHoward Hinnant 12353e519524SHoward Hinnanttemplate<class _Tp> 12363e519524SHoward Hinnantcomplex<_Tp> 12373e519524SHoward Hinnantsinh(const complex<_Tp>& __x) 12383e519524SHoward Hinnant{ 123966631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 12403e519524SHoward Hinnant return complex<_Tp>(__x.real(), _Tp(NAN)); 124166631a12SDuncan P. N. Exon Smith if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 12423e519524SHoward Hinnant return complex<_Tp>(__x.real(), _Tp(NAN)); 124366631a12SDuncan P. N. Exon Smith if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 12443e519524SHoward Hinnant return __x; 12453e519524SHoward Hinnant return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag())); 12463e519524SHoward Hinnant} 12473e519524SHoward Hinnant 12483e519524SHoward Hinnant// cosh 12493e519524SHoward Hinnant 12503e519524SHoward Hinnanttemplate<class _Tp> 12513e519524SHoward Hinnantcomplex<_Tp> 12523e519524SHoward Hinnantcosh(const complex<_Tp>& __x) 12533e519524SHoward Hinnant{ 125466631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 12553e519524SHoward Hinnant return complex<_Tp>(abs(__x.real()), _Tp(NAN)); 125666631a12SDuncan P. N. Exon Smith if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 12573e519524SHoward Hinnant return complex<_Tp>(_Tp(NAN), __x.real()); 12583e519524SHoward Hinnant if (__x.real() == 0 && __x.imag() == 0) 12593e519524SHoward Hinnant return complex<_Tp>(_Tp(1), __x.imag()); 126066631a12SDuncan P. N. Exon Smith if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 12613e519524SHoward Hinnant return complex<_Tp>(abs(__x.real()), __x.imag()); 12623e519524SHoward Hinnant return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag())); 12633e519524SHoward Hinnant} 12643e519524SHoward Hinnant 12653e519524SHoward Hinnant// tanh 12663e519524SHoward Hinnant 12673e519524SHoward Hinnanttemplate<class _Tp> 12683e519524SHoward Hinnantcomplex<_Tp> 12693e519524SHoward Hinnanttanh(const complex<_Tp>& __x) 12703e519524SHoward Hinnant{ 127166631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 12723e519524SHoward Hinnant { 127366631a12SDuncan P. N. Exon Smith if (!__libcpp_isfinite_or_builtin(__x.imag())) 1274de493a26SXiang Gao return complex<_Tp>(copysign(_Tp(1), __x.real()), _Tp(0)); 1275de493a26SXiang Gao return complex<_Tp>(copysign(_Tp(1), __x.real()), copysign(_Tp(0), sin(_Tp(2) * __x.imag()))); 12763e519524SHoward Hinnant } 127766631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 12783e519524SHoward Hinnant return __x; 12793e519524SHoward Hinnant _Tp __2r(_Tp(2) * __x.real()); 12803e519524SHoward Hinnant _Tp __2i(_Tp(2) * __x.imag()); 12813e519524SHoward Hinnant _Tp __d(cosh(__2r) + cos(__2i)); 1282c43826f0SHoward Hinnant _Tp __2rsh(sinh(__2r)); 128366631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__2rsh) && __libcpp_isinf_or_builtin(__d)) 1284c43826f0SHoward Hinnant return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1), 1285c43826f0SHoward Hinnant __2i > _Tp(0) ? _Tp(0) : _Tp(-0.)); 1286c43826f0SHoward Hinnant return complex<_Tp>(__2rsh/__d, sin(__2i)/__d); 12873e519524SHoward Hinnant} 12883e519524SHoward Hinnant 12893e519524SHoward Hinnant// asin 12903e519524SHoward Hinnant 12913e519524SHoward Hinnanttemplate<class _Tp> 12923e519524SHoward Hinnantcomplex<_Tp> 12933e519524SHoward Hinnantasin(const complex<_Tp>& __x) 12943e519524SHoward Hinnant{ 12953e519524SHoward Hinnant complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real())); 12963e519524SHoward Hinnant return complex<_Tp>(__z.imag(), -__z.real()); 12973e519524SHoward Hinnant} 12983e519524SHoward Hinnant 12993e519524SHoward Hinnant// acos 13003e519524SHoward Hinnant 13013e519524SHoward Hinnanttemplate<class _Tp> 13023e519524SHoward Hinnantcomplex<_Tp> 13033e519524SHoward Hinnantacos(const complex<_Tp>& __x) 13043e519524SHoward Hinnant{ 13053e519524SHoward Hinnant const _Tp __pi(atan2(+0., -0.)); 130666631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.real())) 13073e519524SHoward Hinnant { 130866631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.imag())) 13093e519524SHoward Hinnant return complex<_Tp>(__x.imag(), __x.real()); 131066631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 13113e519524SHoward Hinnant { 13123e519524SHoward Hinnant if (__x.real() < _Tp(0)) 13133e519524SHoward Hinnant return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag()); 13143e519524SHoward Hinnant return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag()); 13153e519524SHoward Hinnant } 13163e519524SHoward Hinnant if (__x.real() < _Tp(0)) 13173e519524SHoward Hinnant return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real()); 13183e519524SHoward Hinnant return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real()); 13193e519524SHoward Hinnant } 132066631a12SDuncan P. N. Exon Smith if (__libcpp_isnan_or_builtin(__x.real())) 13213e519524SHoward Hinnant { 132266631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 13233e519524SHoward Hinnant return complex<_Tp>(__x.real(), -__x.imag()); 13243e519524SHoward Hinnant return complex<_Tp>(__x.real(), __x.real()); 13253e519524SHoward Hinnant } 132666631a12SDuncan P. N. Exon Smith if (__libcpp_isinf_or_builtin(__x.imag())) 13273e519524SHoward Hinnant return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 132835508d49SMarshall Clow if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag()))) 13293e519524SHoward Hinnant return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 1330477b5f68SMikhail Maltsev complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 13313e519524SHoward Hinnant if (signbit(__x.imag())) 13323e519524SHoward Hinnant return complex<_Tp>(abs(__z.imag()), abs(__z.real())); 13333e519524SHoward Hinnant return complex<_Tp>(abs(__z.imag()), -abs(__z.real())); 13343e519524SHoward Hinnant} 13353e519524SHoward Hinnant 13363e519524SHoward Hinnant// atan 13373e519524SHoward Hinnant 13383e519524SHoward Hinnanttemplate<class _Tp> 13393e519524SHoward Hinnantcomplex<_Tp> 13403e519524SHoward Hinnantatan(const complex<_Tp>& __x) 13413e519524SHoward Hinnant{ 13423e519524SHoward Hinnant complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real())); 13433e519524SHoward Hinnant return complex<_Tp>(__z.imag(), -__z.real()); 13443e519524SHoward Hinnant} 13453e519524SHoward Hinnant 13463e519524SHoward Hinnant// sin 13473e519524SHoward Hinnant 13483e519524SHoward Hinnanttemplate<class _Tp> 13493e519524SHoward Hinnantcomplex<_Tp> 13503e519524SHoward Hinnantsin(const complex<_Tp>& __x) 13513e519524SHoward Hinnant{ 13523e519524SHoward Hinnant complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real())); 13533e519524SHoward Hinnant return complex<_Tp>(__z.imag(), -__z.real()); 13543e519524SHoward Hinnant} 13553e519524SHoward Hinnant 13563e519524SHoward Hinnant// cos 13573e519524SHoward Hinnant 13583e519524SHoward Hinnanttemplate<class _Tp> 13593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13603e519524SHoward Hinnantcomplex<_Tp> 13613e519524SHoward Hinnantcos(const complex<_Tp>& __x) 13623e519524SHoward Hinnant{ 13633e519524SHoward Hinnant return cosh(complex<_Tp>(-__x.imag(), __x.real())); 13643e519524SHoward Hinnant} 13653e519524SHoward Hinnant 13663e519524SHoward Hinnant// tan 13673e519524SHoward Hinnant 13683e519524SHoward Hinnanttemplate<class _Tp> 13693e519524SHoward Hinnantcomplex<_Tp> 13703e519524SHoward Hinnanttan(const complex<_Tp>& __x) 13713e519524SHoward Hinnant{ 13723e519524SHoward Hinnant complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real())); 13733e519524SHoward Hinnant return complex<_Tp>(__z.imag(), -__z.real()); 13743e519524SHoward Hinnant} 13753e519524SHoward Hinnant 13763e519524SHoward Hinnanttemplate<class _Tp, class _CharT, class _Traits> 13773e519524SHoward Hinnantbasic_istream<_CharT, _Traits>& 13783e519524SHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) 13793e519524SHoward Hinnant{ 13803e519524SHoward Hinnant if (__is.good()) 13813e519524SHoward Hinnant { 13823e519524SHoward Hinnant ws(__is); 13833e519524SHoward Hinnant if (__is.peek() == _CharT('(')) 13843e519524SHoward Hinnant { 13853e519524SHoward Hinnant __is.get(); 13863e519524SHoward Hinnant _Tp __r; 13873e519524SHoward Hinnant __is >> __r; 13883e519524SHoward Hinnant if (!__is.fail()) 13893e519524SHoward Hinnant { 13903e519524SHoward Hinnant ws(__is); 13913e519524SHoward Hinnant _CharT __c = __is.peek(); 13923e519524SHoward Hinnant if (__c == _CharT(',')) 13933e519524SHoward Hinnant { 13943e519524SHoward Hinnant __is.get(); 13953e519524SHoward Hinnant _Tp __i; 13963e519524SHoward Hinnant __is >> __i; 13973e519524SHoward Hinnant if (!__is.fail()) 13983e519524SHoward Hinnant { 13993e519524SHoward Hinnant ws(__is); 14003e519524SHoward Hinnant __c = __is.peek(); 14013e519524SHoward Hinnant if (__c == _CharT(')')) 14023e519524SHoward Hinnant { 14033e519524SHoward Hinnant __is.get(); 14043e519524SHoward Hinnant __x = complex<_Tp>(__r, __i); 14053e519524SHoward Hinnant } 14063e519524SHoward Hinnant else 1407c3478effSLouis Dionne __is.setstate(__is.failbit); 14083e519524SHoward Hinnant } 14093e519524SHoward Hinnant else 1410c3478effSLouis Dionne __is.setstate(__is.failbit); 14113e519524SHoward Hinnant } 14123e519524SHoward Hinnant else if (__c == _CharT(')')) 14133e519524SHoward Hinnant { 14143e519524SHoward Hinnant __is.get(); 14153e519524SHoward Hinnant __x = complex<_Tp>(__r, _Tp(0)); 14163e519524SHoward Hinnant } 14173e519524SHoward Hinnant else 1418c3478effSLouis Dionne __is.setstate(__is.failbit); 14193e519524SHoward Hinnant } 14203e519524SHoward Hinnant else 1421c3478effSLouis Dionne __is.setstate(__is.failbit); 14223e519524SHoward Hinnant } 14233e519524SHoward Hinnant else 14243e519524SHoward Hinnant { 14253e519524SHoward Hinnant _Tp __r; 14263e519524SHoward Hinnant __is >> __r; 14273e519524SHoward Hinnant if (!__is.fail()) 14283e519524SHoward Hinnant __x = complex<_Tp>(__r, _Tp(0)); 14293e519524SHoward Hinnant else 1430c3478effSLouis Dionne __is.setstate(__is.failbit); 14313e519524SHoward Hinnant } 14323e519524SHoward Hinnant } 14333e519524SHoward Hinnant else 1434c3478effSLouis Dionne __is.setstate(__is.failbit); 14353e519524SHoward Hinnant return __is; 14363e519524SHoward Hinnant} 14373e519524SHoward Hinnant 143888ffc727SLouis Dionne#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) 14393e519524SHoward Hinnanttemplate<class _Tp, class _CharT, class _Traits> 14403e519524SHoward Hinnantbasic_ostream<_CharT, _Traits>& 14413e519524SHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 14423e519524SHoward Hinnant{ 1443aa0b991dSAntonio Sanchez basic_ostringstream<_CharT, _Traits> __s; 1444aa0b991dSAntonio Sanchez __s.flags(__os.flags()); 1445aa0b991dSAntonio Sanchez __s.imbue(__os.getloc()); 1446aa0b991dSAntonio Sanchez __s.precision(__os.precision()); 1447aa0b991dSAntonio Sanchez __s << '(' << __x.real() << ',' << __x.imag() << ')'; 1448aa0b991dSAntonio Sanchez return __os << __s.str(); 14493e519524SHoward Hinnant} 145088ffc727SLouis Dionne#endif // !_LIBCPP_HAS_NO_LOCALIZATION 14513e519524SHoward Hinnant 1452ea7c7cc5SMarshall Clow#if _LIBCPP_STD_VER > 11 1453ea7c7cc5SMarshall Clow// Literal suffix for complex number literals [complex.literals] 1454ea7c7cc5SMarshall Clowinline namespace literals 1455ea7c7cc5SMarshall Clow{ 1456ea7c7cc5SMarshall Clow inline namespace complex_literals 1457ea7c7cc5SMarshall Clow { 1458ea7c7cc5SMarshall Clow constexpr complex<long double> operator""il(long double __im) 1459ea7c7cc5SMarshall Clow { 1460ea7c7cc5SMarshall Clow return { 0.0l, __im }; 1461ea7c7cc5SMarshall Clow } 1462ea7c7cc5SMarshall Clow 1463ea7c7cc5SMarshall Clow constexpr complex<long double> operator""il(unsigned long long __im) 1464ea7c7cc5SMarshall Clow { 1465ea7c7cc5SMarshall Clow return { 0.0l, static_cast<long double>(__im) }; 1466ea7c7cc5SMarshall Clow } 1467ea7c7cc5SMarshall Clow 1468ea7c7cc5SMarshall Clow 1469ea7c7cc5SMarshall Clow constexpr complex<double> operator""i(long double __im) 1470ea7c7cc5SMarshall Clow { 1471ea7c7cc5SMarshall Clow return { 0.0, static_cast<double>(__im) }; 1472ea7c7cc5SMarshall Clow } 1473ea7c7cc5SMarshall Clow 1474ea7c7cc5SMarshall Clow constexpr complex<double> operator""i(unsigned long long __im) 1475ea7c7cc5SMarshall Clow { 1476ea7c7cc5SMarshall Clow return { 0.0, static_cast<double>(__im) }; 1477ea7c7cc5SMarshall Clow } 1478ea7c7cc5SMarshall Clow 1479ea7c7cc5SMarshall Clow 1480ea7c7cc5SMarshall Clow constexpr complex<float> operator""if(long double __im) 1481ea7c7cc5SMarshall Clow { 1482ea7c7cc5SMarshall Clow return { 0.0f, static_cast<float>(__im) }; 1483ea7c7cc5SMarshall Clow } 1484ea7c7cc5SMarshall Clow 1485ea7c7cc5SMarshall Clow constexpr complex<float> operator""if(unsigned long long __im) 1486ea7c7cc5SMarshall Clow { 1487ea7c7cc5SMarshall Clow return { 0.0f, static_cast<float>(__im) }; 1488ea7c7cc5SMarshall Clow } 1489d2b0df35SNikolas Klauser } // namespace complex_literals 1490d2b0df35SNikolas Klauser} // namespace literals 1491ea7c7cc5SMarshall Clow#endif 1492ea7c7cc5SMarshall Clow 14933e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 14943e519524SHoward Hinnant 14953e519524SHoward Hinnant#endif // _LIBCPP_COMPLEX 1496