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