xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/std/complex (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg// The template and inlines for the -*- C++ -*- complex number classes.
21debfc3dSmrg
3*8feb0f0bSmrg// Copyright (C) 1997-2020 Free Software Foundation, Inc.
41debfc3dSmrg//
51debfc3dSmrg// This file is part of the GNU ISO C++ Library.  This library is free
61debfc3dSmrg// software; you can redistribute it and/or modify it under the
71debfc3dSmrg// terms of the GNU General Public License as published by the
81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option)
91debfc3dSmrg// any later version.
101debfc3dSmrg
111debfc3dSmrg// This library is distributed in the hope that it will be useful,
121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141debfc3dSmrg// GNU General Public License for more details.
151debfc3dSmrg
161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional
171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version
181debfc3dSmrg// 3.1, as published by the Free Software Foundation.
191debfc3dSmrg
201debfc3dSmrg// You should have received a copy of the GNU General Public License and
211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program;
221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
231debfc3dSmrg// <http://www.gnu.org/licenses/>.
241debfc3dSmrg
251debfc3dSmrg/** @file include/complex
261debfc3dSmrg *  This is a Standard C++ Library header.
271debfc3dSmrg */
281debfc3dSmrg
291debfc3dSmrg//
301debfc3dSmrg// ISO C++ 14882: 26.2  Complex Numbers
311debfc3dSmrg// Note: this is not a conforming implementation.
321debfc3dSmrg// Initially implemented by Ulrich Drepper <drepper@cygnus.com>
331debfc3dSmrg// Improved by Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
341debfc3dSmrg//
351debfc3dSmrg
361debfc3dSmrg#ifndef _GLIBCXX_COMPLEX
371debfc3dSmrg#define _GLIBCXX_COMPLEX 1
381debfc3dSmrg
391debfc3dSmrg#pragma GCC system_header
401debfc3dSmrg
411debfc3dSmrg#include <bits/c++config.h>
421debfc3dSmrg#include <bits/cpp_type_traits.h>
431debfc3dSmrg#include <ext/type_traits.h>
441debfc3dSmrg#include <cmath>
451debfc3dSmrg#include <sstream>
461debfc3dSmrg
471debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
481debfc3dSmrg// This is disgusting; we can't include ccomplex because that requires c++11
491debfc3dSmrg// and we can't use the builtins because those point to the wrong
501debfc3dSmrg// ABI-wise cabs/cabsf so we manually declare those here and use
511debfc3dSmrg// them directly.
521debfc3dSmrgextern "C" float __c99_cabsf(_Complex float);
531debfc3dSmrgextern "C" double __c99_cabs(_Complex double);
541debfc3dSmrgextern "C" long double __c99_cabsl(_Complex long double);
551debfc3dSmrg#endif
561debfc3dSmrg
571debfc3dSmrg// Get rid of a macro possibly defined in <complex.h>
581debfc3dSmrg#undef complex
591debfc3dSmrg
60*8feb0f0bSmrg#if __cplusplus > 201703L
61*8feb0f0bSmrg# define __cpp_lib_constexpr_complex 201711L
62*8feb0f0bSmrg#endif
63*8feb0f0bSmrg
641debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default)
651debfc3dSmrg{
661debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
671debfc3dSmrg
681debfc3dSmrg  /**
691debfc3dSmrg   * @defgroup complex_numbers Complex Numbers
701debfc3dSmrg   * @ingroup numerics
711debfc3dSmrg   *
721debfc3dSmrg   * Classes and functions for complex numbers.
731debfc3dSmrg   * @{
741debfc3dSmrg   */
751debfc3dSmrg
761debfc3dSmrg  // Forward declarations.
771debfc3dSmrg  template<typename _Tp> class complex;
781debfc3dSmrg  template<> class complex<float>;
791debfc3dSmrg  template<> class complex<double>;
801debfc3dSmrg  template<> class complex<long double>;
811debfc3dSmrg
821debfc3dSmrg  ///  Return magnitude of @a z.
831debfc3dSmrg  template<typename _Tp> _Tp abs(const complex<_Tp>&);
841debfc3dSmrg  ///  Return phase angle of @a z.
851debfc3dSmrg  template<typename _Tp> _Tp arg(const complex<_Tp>&);
861debfc3dSmrg  ///  Return @a z magnitude squared.
87c0a68be4Smrg  template<typename _Tp> _Tp _GLIBCXX20_CONSTEXPR norm(const complex<_Tp>&);
881debfc3dSmrg
891debfc3dSmrg  ///  Return complex conjugate of @a z.
90c0a68be4Smrg  template<typename _Tp>
91c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp> conj(const complex<_Tp>&);
921debfc3dSmrg  ///  Return complex with magnitude @a rho and angle @a theta.
931debfc3dSmrg  template<typename _Tp> complex<_Tp> polar(const _Tp&, const _Tp& = 0);
941debfc3dSmrg
951debfc3dSmrg  // Transcendentals:
961debfc3dSmrg  /// Return complex cosine of @a z.
971debfc3dSmrg  template<typename _Tp> complex<_Tp> cos(const complex<_Tp>&);
981debfc3dSmrg  /// Return complex hyperbolic cosine of @a z.
991debfc3dSmrg  template<typename _Tp> complex<_Tp> cosh(const complex<_Tp>&);
1001debfc3dSmrg  /// Return complex base e exponential of @a z.
1011debfc3dSmrg  template<typename _Tp> complex<_Tp> exp(const complex<_Tp>&);
1021debfc3dSmrg  /// Return complex natural logarithm of @a z.
1031debfc3dSmrg  template<typename _Tp> complex<_Tp> log(const complex<_Tp>&);
1041debfc3dSmrg  /// Return complex base 10 logarithm of @a z.
1051debfc3dSmrg  template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&);
1061debfc3dSmrg  /// Return @a x to the @a y'th power.
1071debfc3dSmrg  template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int);
1081debfc3dSmrg  /// Return @a x to the @a y'th power.
1091debfc3dSmrg  template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&);
1101debfc3dSmrg  /// Return @a x to the @a y'th power.
1111debfc3dSmrg  template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&,
1121debfc3dSmrg                                          const complex<_Tp>&);
1131debfc3dSmrg  /// Return @a x to the @a y'th power.
1141debfc3dSmrg  template<typename _Tp> complex<_Tp> pow(const _Tp&, const complex<_Tp>&);
1151debfc3dSmrg  /// Return complex sine of @a z.
1161debfc3dSmrg  template<typename _Tp> complex<_Tp> sin(const complex<_Tp>&);
1171debfc3dSmrg  /// Return complex hyperbolic sine of @a z.
1181debfc3dSmrg  template<typename _Tp> complex<_Tp> sinh(const complex<_Tp>&);
1191debfc3dSmrg  /// Return complex square root of @a z.
1201debfc3dSmrg  template<typename _Tp> complex<_Tp> sqrt(const complex<_Tp>&);
1211debfc3dSmrg  /// Return complex tangent of @a z.
1221debfc3dSmrg  template<typename _Tp> complex<_Tp> tan(const complex<_Tp>&);
1231debfc3dSmrg  /// Return complex hyperbolic tangent of @a z.
1241debfc3dSmrg  template<typename _Tp> complex<_Tp> tanh(const complex<_Tp>&);
1251debfc3dSmrg
1261debfc3dSmrg
1271debfc3dSmrg  // 26.2.2  Primary template class complex
1281debfc3dSmrg  /**
1291debfc3dSmrg   *  Template to represent complex numbers.
1301debfc3dSmrg   *
1311debfc3dSmrg   *  Specializations for float, double, and long double are part of the
1321debfc3dSmrg   *  library.  Results with any other type are not guaranteed.
1331debfc3dSmrg   *
1341debfc3dSmrg   *  @param  Tp  Type of real and imaginary values.
1351debfc3dSmrg  */
1361debfc3dSmrg  template<typename _Tp>
1371debfc3dSmrg    struct complex
1381debfc3dSmrg    {
1391debfc3dSmrg      /// Value typedef.
1401debfc3dSmrg      typedef _Tp value_type;
1411debfc3dSmrg
1421debfc3dSmrg      ///  Default constructor.  First parameter is x, second parameter is y.
1431debfc3dSmrg      ///  Unspecified parameters default to 0.
1441debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp())
1451debfc3dSmrg      : _M_real(__r), _M_imag(__i) { }
1461debfc3dSmrg
1471debfc3dSmrg      // Let the compiler synthesize the copy constructor
1481debfc3dSmrg#if __cplusplus >= 201103L
1491debfc3dSmrg      constexpr complex(const complex&) = default;
1501debfc3dSmrg#endif
1511debfc3dSmrg
1521debfc3dSmrg      ///  Converting constructor.
1531debfc3dSmrg      template<typename _Up>
1541debfc3dSmrg        _GLIBCXX_CONSTEXPR complex(const complex<_Up>& __z)
1551debfc3dSmrg	: _M_real(__z.real()), _M_imag(__z.imag()) { }
1561debfc3dSmrg
1571debfc3dSmrg#if __cplusplus >= 201103L
1581debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1591debfc3dSmrg      // DR 387. std::complex over-encapsulated.
1601debfc3dSmrg      _GLIBCXX_ABI_TAG_CXX11
1611debfc3dSmrg      constexpr _Tp
1621debfc3dSmrg      real() const { return _M_real; }
1631debfc3dSmrg
1641debfc3dSmrg      _GLIBCXX_ABI_TAG_CXX11
1651debfc3dSmrg      constexpr _Tp
1661debfc3dSmrg      imag() const { return _M_imag; }
1671debfc3dSmrg#else
1681debfc3dSmrg      ///  Return real part of complex number.
1691debfc3dSmrg      _Tp&
1701debfc3dSmrg      real() { return _M_real; }
1711debfc3dSmrg
1721debfc3dSmrg      ///  Return real part of complex number.
1731debfc3dSmrg      const _Tp&
1741debfc3dSmrg      real() const { return _M_real; }
1751debfc3dSmrg
1761debfc3dSmrg      ///  Return imaginary part of complex number.
1771debfc3dSmrg      _Tp&
1781debfc3dSmrg      imag() { return _M_imag; }
1791debfc3dSmrg
1801debfc3dSmrg      ///  Return imaginary part of complex number.
1811debfc3dSmrg      const _Tp&
1821debfc3dSmrg      imag() const { return _M_imag; }
1831debfc3dSmrg#endif
1841debfc3dSmrg
1851debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1861debfc3dSmrg      // DR 387. std::complex over-encapsulated.
187c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
1881debfc3dSmrg      real(_Tp __val) { _M_real = __val; }
1891debfc3dSmrg
190c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
1911debfc3dSmrg      imag(_Tp __val) { _M_imag = __val; }
1921debfc3dSmrg
1931debfc3dSmrg      /// Assign a scalar to this complex number.
194c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const _Tp&);
1951debfc3dSmrg
1961debfc3dSmrg      /// Add a scalar to this complex number.
1971debfc3dSmrg      // 26.2.5/1
198c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex<_Tp>&
1991debfc3dSmrg      operator+=(const _Tp& __t)
2001debfc3dSmrg      {
2011debfc3dSmrg	_M_real += __t;
2021debfc3dSmrg	return *this;
2031debfc3dSmrg      }
2041debfc3dSmrg
2051debfc3dSmrg      /// Subtract a scalar from this complex number.
2061debfc3dSmrg      // 26.2.5/3
207c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex<_Tp>&
2081debfc3dSmrg      operator-=(const _Tp& __t)
2091debfc3dSmrg      {
2101debfc3dSmrg	_M_real -= __t;
2111debfc3dSmrg	return *this;
2121debfc3dSmrg      }
2131debfc3dSmrg
2141debfc3dSmrg      /// Multiply this complex number by a scalar.
215c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const _Tp&);
2161debfc3dSmrg      /// Divide this complex number by a scalar.
217c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const _Tp&);
2181debfc3dSmrg
2191debfc3dSmrg      // Let the compiler synthesize the copy assignment operator
2201debfc3dSmrg#if __cplusplus >= 201103L
221c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex& operator=(const complex&) = default;
2221debfc3dSmrg#endif
2231debfc3dSmrg
2241debfc3dSmrg      /// Assign another complex number to this one.
2251debfc3dSmrg      template<typename _Up>
226c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex<_Tp>& operator=(const complex<_Up>&);
2271debfc3dSmrg      /// Add another complex number to this one.
2281debfc3dSmrg      template<typename _Up>
229c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex<_Tp>& operator+=(const complex<_Up>&);
2301debfc3dSmrg      /// Subtract another complex number from this one.
2311debfc3dSmrg      template<typename _Up>
232c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex<_Tp>& operator-=(const complex<_Up>&);
2331debfc3dSmrg      /// Multiply this complex number by another.
2341debfc3dSmrg      template<typename _Up>
235c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex<_Tp>& operator*=(const complex<_Up>&);
2361debfc3dSmrg      /// Divide this complex number by another.
2371debfc3dSmrg      template<typename _Up>
238c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex<_Tp>& operator/=(const complex<_Up>&);
2391debfc3dSmrg
2401debfc3dSmrg      _GLIBCXX_CONSTEXPR complex __rep() const
2411debfc3dSmrg      { return *this; }
2421debfc3dSmrg
2431debfc3dSmrg    private:
2441debfc3dSmrg      _Tp _M_real;
2451debfc3dSmrg      _Tp _M_imag;
2461debfc3dSmrg    };
2471debfc3dSmrg
2481debfc3dSmrg  template<typename _Tp>
249c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
2501debfc3dSmrg    complex<_Tp>::operator=(const _Tp& __t)
2511debfc3dSmrg    {
2521debfc3dSmrg     _M_real = __t;
2531debfc3dSmrg     _M_imag = _Tp();
2541debfc3dSmrg     return *this;
2551debfc3dSmrg    }
2561debfc3dSmrg
2571debfc3dSmrg  // 26.2.5/5
2581debfc3dSmrg  template<typename _Tp>
259c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
2601debfc3dSmrg    complex<_Tp>::operator*=(const _Tp& __t)
2611debfc3dSmrg    {
2621debfc3dSmrg      _M_real *= __t;
2631debfc3dSmrg      _M_imag *= __t;
2641debfc3dSmrg      return *this;
2651debfc3dSmrg    }
2661debfc3dSmrg
2671debfc3dSmrg  // 26.2.5/7
2681debfc3dSmrg  template<typename _Tp>
269c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
2701debfc3dSmrg    complex<_Tp>::operator/=(const _Tp& __t)
2711debfc3dSmrg    {
2721debfc3dSmrg      _M_real /= __t;
2731debfc3dSmrg      _M_imag /= __t;
2741debfc3dSmrg      return *this;
2751debfc3dSmrg    }
2761debfc3dSmrg
2771debfc3dSmrg  template<typename _Tp>
2781debfc3dSmrg    template<typename _Up>
279c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
2801debfc3dSmrg    complex<_Tp>::operator=(const complex<_Up>& __z)
2811debfc3dSmrg    {
2821debfc3dSmrg      _M_real = __z.real();
2831debfc3dSmrg      _M_imag = __z.imag();
2841debfc3dSmrg      return *this;
2851debfc3dSmrg    }
2861debfc3dSmrg
2871debfc3dSmrg  // 26.2.5/9
2881debfc3dSmrg  template<typename _Tp>
2891debfc3dSmrg    template<typename _Up>
290c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
2911debfc3dSmrg    complex<_Tp>::operator+=(const complex<_Up>& __z)
2921debfc3dSmrg    {
2931debfc3dSmrg      _M_real += __z.real();
2941debfc3dSmrg      _M_imag += __z.imag();
2951debfc3dSmrg      return *this;
2961debfc3dSmrg    }
2971debfc3dSmrg
2981debfc3dSmrg  // 26.2.5/11
2991debfc3dSmrg  template<typename _Tp>
3001debfc3dSmrg    template<typename _Up>
301c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
3021debfc3dSmrg    complex<_Tp>::operator-=(const complex<_Up>& __z)
3031debfc3dSmrg    {
3041debfc3dSmrg      _M_real -= __z.real();
3051debfc3dSmrg      _M_imag -= __z.imag();
3061debfc3dSmrg      return *this;
3071debfc3dSmrg    }
3081debfc3dSmrg
3091debfc3dSmrg  // 26.2.5/13
3101debfc3dSmrg  // XXX: This is a grammar school implementation.
3111debfc3dSmrg  template<typename _Tp>
3121debfc3dSmrg    template<typename _Up>
313c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
3141debfc3dSmrg    complex<_Tp>::operator*=(const complex<_Up>& __z)
3151debfc3dSmrg    {
3161debfc3dSmrg      const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag();
3171debfc3dSmrg      _M_imag = _M_real * __z.imag() + _M_imag * __z.real();
3181debfc3dSmrg      _M_real = __r;
3191debfc3dSmrg      return *this;
3201debfc3dSmrg    }
3211debfc3dSmrg
3221debfc3dSmrg  // 26.2.5/15
3231debfc3dSmrg  // XXX: This is a grammar school implementation.
3241debfc3dSmrg  template<typename _Tp>
3251debfc3dSmrg    template<typename _Up>
326c0a68be4Smrg    _GLIBCXX20_CONSTEXPR complex<_Tp>&
3271debfc3dSmrg    complex<_Tp>::operator/=(const complex<_Up>& __z)
3281debfc3dSmrg    {
3291debfc3dSmrg      const _Tp __r =  _M_real * __z.real() + _M_imag * __z.imag();
3301debfc3dSmrg      const _Tp __n = std::norm(__z);
3311debfc3dSmrg      _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n;
3321debfc3dSmrg      _M_real = __r / __n;
3331debfc3dSmrg      return *this;
3341debfc3dSmrg    }
3351debfc3dSmrg
3361debfc3dSmrg  // Operators:
337*8feb0f0bSmrg  ///@{
3381debfc3dSmrg  ///  Return new complex value @a x plus @a y.
3391debfc3dSmrg  template<typename _Tp>
340c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
3411debfc3dSmrg    operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
3421debfc3dSmrg    {
3431debfc3dSmrg      complex<_Tp> __r = __x;
3441debfc3dSmrg      __r += __y;
3451debfc3dSmrg      return __r;
3461debfc3dSmrg    }
3471debfc3dSmrg
3481debfc3dSmrg  template<typename _Tp>
349c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
3501debfc3dSmrg    operator+(const complex<_Tp>& __x, const _Tp& __y)
3511debfc3dSmrg    {
3521debfc3dSmrg      complex<_Tp> __r = __x;
3531debfc3dSmrg      __r += __y;
3541debfc3dSmrg      return __r;
3551debfc3dSmrg    }
3561debfc3dSmrg
3571debfc3dSmrg  template<typename _Tp>
358c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
3591debfc3dSmrg    operator+(const _Tp& __x, const complex<_Tp>& __y)
3601debfc3dSmrg    {
3611debfc3dSmrg      complex<_Tp> __r = __y;
3621debfc3dSmrg      __r += __x;
3631debfc3dSmrg      return __r;
3641debfc3dSmrg    }
365*8feb0f0bSmrg  ///@}
3661debfc3dSmrg
367*8feb0f0bSmrg  ///@{
3681debfc3dSmrg  ///  Return new complex value @a x minus @a y.
3691debfc3dSmrg  template<typename _Tp>
370c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
3711debfc3dSmrg    operator-(const complex<_Tp>& __x, const complex<_Tp>& __y)
3721debfc3dSmrg    {
3731debfc3dSmrg      complex<_Tp> __r = __x;
3741debfc3dSmrg      __r -= __y;
3751debfc3dSmrg      return __r;
3761debfc3dSmrg    }
3771debfc3dSmrg
3781debfc3dSmrg  template<typename _Tp>
379c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
3801debfc3dSmrg    operator-(const complex<_Tp>& __x, const _Tp& __y)
3811debfc3dSmrg    {
3821debfc3dSmrg      complex<_Tp> __r = __x;
3831debfc3dSmrg      __r -= __y;
3841debfc3dSmrg      return __r;
3851debfc3dSmrg    }
3861debfc3dSmrg
3871debfc3dSmrg  template<typename _Tp>
388c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
3891debfc3dSmrg    operator-(const _Tp& __x, const complex<_Tp>& __y)
3901debfc3dSmrg    {
391c0a68be4Smrg      complex<_Tp> __r = -__y;
392c0a68be4Smrg      __r += __x;
3931debfc3dSmrg      return __r;
3941debfc3dSmrg    }
395*8feb0f0bSmrg  ///@}
3961debfc3dSmrg
397*8feb0f0bSmrg  ///@{
3981debfc3dSmrg  ///  Return new complex value @a x times @a y.
3991debfc3dSmrg  template<typename _Tp>
400c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4011debfc3dSmrg    operator*(const complex<_Tp>& __x, const complex<_Tp>& __y)
4021debfc3dSmrg    {
4031debfc3dSmrg      complex<_Tp> __r = __x;
4041debfc3dSmrg      __r *= __y;
4051debfc3dSmrg      return __r;
4061debfc3dSmrg    }
4071debfc3dSmrg
4081debfc3dSmrg  template<typename _Tp>
409c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4101debfc3dSmrg    operator*(const complex<_Tp>& __x, const _Tp& __y)
4111debfc3dSmrg    {
4121debfc3dSmrg      complex<_Tp> __r = __x;
4131debfc3dSmrg      __r *= __y;
4141debfc3dSmrg      return __r;
4151debfc3dSmrg    }
4161debfc3dSmrg
4171debfc3dSmrg  template<typename _Tp>
418c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4191debfc3dSmrg    operator*(const _Tp& __x, const complex<_Tp>& __y)
4201debfc3dSmrg    {
4211debfc3dSmrg      complex<_Tp> __r = __y;
4221debfc3dSmrg      __r *= __x;
4231debfc3dSmrg      return __r;
4241debfc3dSmrg    }
425*8feb0f0bSmrg  ///@}
4261debfc3dSmrg
427*8feb0f0bSmrg  ///@{
4281debfc3dSmrg  ///  Return new complex value @a x divided by @a y.
4291debfc3dSmrg  template<typename _Tp>
430c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4311debfc3dSmrg    operator/(const complex<_Tp>& __x, const complex<_Tp>& __y)
4321debfc3dSmrg    {
4331debfc3dSmrg      complex<_Tp> __r = __x;
4341debfc3dSmrg      __r /= __y;
4351debfc3dSmrg      return __r;
4361debfc3dSmrg    }
4371debfc3dSmrg
4381debfc3dSmrg  template<typename _Tp>
439c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4401debfc3dSmrg    operator/(const complex<_Tp>& __x, const _Tp& __y)
4411debfc3dSmrg    {
4421debfc3dSmrg      complex<_Tp> __r = __x;
4431debfc3dSmrg      __r /= __y;
4441debfc3dSmrg      return __r;
4451debfc3dSmrg    }
4461debfc3dSmrg
4471debfc3dSmrg  template<typename _Tp>
448c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4491debfc3dSmrg    operator/(const _Tp& __x, const complex<_Tp>& __y)
4501debfc3dSmrg    {
4511debfc3dSmrg      complex<_Tp> __r = __x;
4521debfc3dSmrg      __r /= __y;
4531debfc3dSmrg      return __r;
4541debfc3dSmrg    }
455*8feb0f0bSmrg  ///@}
4561debfc3dSmrg
4571debfc3dSmrg  ///  Return @a x.
4581debfc3dSmrg  template<typename _Tp>
459c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4601debfc3dSmrg    operator+(const complex<_Tp>& __x)
4611debfc3dSmrg    { return __x; }
4621debfc3dSmrg
4631debfc3dSmrg  ///  Return complex negation of @a x.
4641debfc3dSmrg  template<typename _Tp>
465c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
4661debfc3dSmrg    operator-(const complex<_Tp>& __x)
4671debfc3dSmrg    { return complex<_Tp>(-__x.real(), -__x.imag()); }
4681debfc3dSmrg
469*8feb0f0bSmrg  ///@{
4701debfc3dSmrg  ///  Return true if @a x is equal to @a y.
4711debfc3dSmrg  template<typename _Tp>
4721debfc3dSmrg    inline _GLIBCXX_CONSTEXPR bool
4731debfc3dSmrg    operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
4741debfc3dSmrg    { return __x.real() == __y.real() && __x.imag() == __y.imag(); }
4751debfc3dSmrg
4761debfc3dSmrg  template<typename _Tp>
4771debfc3dSmrg    inline _GLIBCXX_CONSTEXPR bool
4781debfc3dSmrg    operator==(const complex<_Tp>& __x, const _Tp& __y)
4791debfc3dSmrg    { return __x.real() == __y && __x.imag() == _Tp(); }
4801debfc3dSmrg
481*8feb0f0bSmrg#if !(__cpp_impl_three_way_comparison >= 201907L)
4821debfc3dSmrg  template<typename _Tp>
4831debfc3dSmrg    inline _GLIBCXX_CONSTEXPR bool
4841debfc3dSmrg    operator==(const _Tp& __x, const complex<_Tp>& __y)
4851debfc3dSmrg    { return __x == __y.real() && _Tp() == __y.imag(); }
486*8feb0f0bSmrg  ///@}
4871debfc3dSmrg
488*8feb0f0bSmrg  ///@{
4891debfc3dSmrg  ///  Return false if @a x is equal to @a y.
4901debfc3dSmrg  template<typename _Tp>
4911debfc3dSmrg    inline _GLIBCXX_CONSTEXPR bool
4921debfc3dSmrg    operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
4931debfc3dSmrg    { return __x.real() != __y.real() || __x.imag() != __y.imag(); }
4941debfc3dSmrg
4951debfc3dSmrg  template<typename _Tp>
4961debfc3dSmrg    inline _GLIBCXX_CONSTEXPR bool
4971debfc3dSmrg    operator!=(const complex<_Tp>& __x, const _Tp& __y)
4981debfc3dSmrg    { return __x.real() != __y || __x.imag() != _Tp(); }
4991debfc3dSmrg
5001debfc3dSmrg  template<typename _Tp>
5011debfc3dSmrg    inline _GLIBCXX_CONSTEXPR bool
5021debfc3dSmrg    operator!=(const _Tp& __x, const complex<_Tp>& __y)
5031debfc3dSmrg    { return __x != __y.real() || _Tp() != __y.imag(); }
504*8feb0f0bSmrg#endif
505*8feb0f0bSmrg  ///@}
5061debfc3dSmrg
5071debfc3dSmrg  ///  Extraction operator for complex values.
5081debfc3dSmrg  template<typename _Tp, typename _CharT, class _Traits>
5091debfc3dSmrg    basic_istream<_CharT, _Traits>&
5101debfc3dSmrg    operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
5111debfc3dSmrg    {
512a2dc1f3fSmrg      bool __fail = true;
513a2dc1f3fSmrg      _CharT __ch;
514a2dc1f3fSmrg      if (__is >> __ch)
5151debfc3dSmrg	{
516a2dc1f3fSmrg	  if (_Traits::eq(__ch, __is.widen('(')))
5171debfc3dSmrg	    {
518a2dc1f3fSmrg	      _Tp __u;
519a2dc1f3fSmrg	      if (__is >> __u >> __ch)
520a2dc1f3fSmrg		{
521a2dc1f3fSmrg		  const _CharT __rparen = __is.widen(')');
522a2dc1f3fSmrg		  if (_Traits::eq(__ch, __rparen))
523a2dc1f3fSmrg		    {
524a2dc1f3fSmrg		      __x = __u;
525a2dc1f3fSmrg		      __fail = false;
5261debfc3dSmrg		    }
527a2dc1f3fSmrg		  else if (_Traits::eq(__ch, __is.widen(',')))
528a2dc1f3fSmrg		    {
529a2dc1f3fSmrg		      _Tp __v;
530a2dc1f3fSmrg		      if (__is >> __v >> __ch)
531a2dc1f3fSmrg			{
532a2dc1f3fSmrg			  if (_Traits::eq(__ch, __rparen))
533a2dc1f3fSmrg			    {
534a2dc1f3fSmrg			      __x = complex<_Tp>(__u, __v);
535a2dc1f3fSmrg			      __fail = false;
5361debfc3dSmrg			    }
537a2dc1f3fSmrg			  else
538a2dc1f3fSmrg			    __is.putback(__ch);
539a2dc1f3fSmrg			}
540a2dc1f3fSmrg		    }
541a2dc1f3fSmrg		  else
542a2dc1f3fSmrg		    __is.putback(__ch);
543a2dc1f3fSmrg		}
544a2dc1f3fSmrg	    }
545a2dc1f3fSmrg	  else
5461debfc3dSmrg	    {
5471debfc3dSmrg	      __is.putback(__ch);
548a2dc1f3fSmrg	      _Tp __u;
549a2dc1f3fSmrg	      if (__is >> __u)
550a2dc1f3fSmrg		{
551a2dc1f3fSmrg		  __x = __u;
552a2dc1f3fSmrg		  __fail = false;
5531debfc3dSmrg		}
554a2dc1f3fSmrg	    }
555a2dc1f3fSmrg	}
556a2dc1f3fSmrg      if (__fail)
557a2dc1f3fSmrg	__is.setstate(ios_base::failbit);
5581debfc3dSmrg      return __is;
5591debfc3dSmrg    }
5601debfc3dSmrg
5611debfc3dSmrg  ///  Insertion operator for complex values.
5621debfc3dSmrg  template<typename _Tp, typename _CharT, class _Traits>
5631debfc3dSmrg    basic_ostream<_CharT, _Traits>&
5641debfc3dSmrg    operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
5651debfc3dSmrg    {
5661debfc3dSmrg      basic_ostringstream<_CharT, _Traits> __s;
5671debfc3dSmrg      __s.flags(__os.flags());
5681debfc3dSmrg      __s.imbue(__os.getloc());
5691debfc3dSmrg      __s.precision(__os.precision());
5701debfc3dSmrg      __s << '(' << __x.real() << ',' << __x.imag() << ')';
5711debfc3dSmrg      return __os << __s.str();
5721debfc3dSmrg    }
5731debfc3dSmrg
5741debfc3dSmrg  // Values
5751debfc3dSmrg#if __cplusplus >= 201103L
5761debfc3dSmrg  template<typename _Tp>
5771debfc3dSmrg    constexpr _Tp
5781debfc3dSmrg    real(const complex<_Tp>& __z)
5791debfc3dSmrg    { return __z.real(); }
5801debfc3dSmrg
5811debfc3dSmrg  template<typename _Tp>
5821debfc3dSmrg    constexpr _Tp
5831debfc3dSmrg    imag(const complex<_Tp>& __z)
5841debfc3dSmrg    { return __z.imag(); }
5851debfc3dSmrg#else
5861debfc3dSmrg  template<typename _Tp>
5871debfc3dSmrg    inline _Tp&
5881debfc3dSmrg    real(complex<_Tp>& __z)
5891debfc3dSmrg    { return __z.real(); }
5901debfc3dSmrg
5911debfc3dSmrg  template<typename _Tp>
5921debfc3dSmrg    inline const _Tp&
5931debfc3dSmrg    real(const complex<_Tp>& __z)
5941debfc3dSmrg    { return __z.real(); }
5951debfc3dSmrg
5961debfc3dSmrg  template<typename _Tp>
5971debfc3dSmrg    inline _Tp&
5981debfc3dSmrg    imag(complex<_Tp>& __z)
5991debfc3dSmrg    { return __z.imag(); }
6001debfc3dSmrg
6011debfc3dSmrg  template<typename _Tp>
6021debfc3dSmrg    inline const _Tp&
6031debfc3dSmrg    imag(const complex<_Tp>& __z)
6041debfc3dSmrg    { return __z.imag(); }
6051debfc3dSmrg#endif
6061debfc3dSmrg
6071debfc3dSmrg  // 26.2.7/3 abs(__z):  Returns the magnitude of __z.
6081debfc3dSmrg  template<typename _Tp>
6091debfc3dSmrg    inline _Tp
6101debfc3dSmrg    __complex_abs(const complex<_Tp>& __z)
6111debfc3dSmrg    {
6121debfc3dSmrg      _Tp __x = __z.real();
6131debfc3dSmrg      _Tp __y = __z.imag();
6141debfc3dSmrg      const _Tp __s = std::max(abs(__x), abs(__y));
6151debfc3dSmrg      if (__s == _Tp())  // well ...
6161debfc3dSmrg        return __s;
6171debfc3dSmrg      __x /= __s;
6181debfc3dSmrg      __y /= __s;
6191debfc3dSmrg      return __s * sqrt(__x * __x + __y * __y);
6201debfc3dSmrg    }
6211debfc3dSmrg
6221debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
6231debfc3dSmrg  // XXX: We can't use __builtin_cabs* because they are broken
6241debfc3dSmrg  inline float
6251debfc3dSmrg  __complex_abs(__complex__ float __z) { return __c99_cabsf(__z); }
6261debfc3dSmrg
6271debfc3dSmrg  inline double
6281debfc3dSmrg  __complex_abs(__complex__ double __z) { return __c99_cabs(__z); }
6291debfc3dSmrg
6301debfc3dSmrg  inline long double
6311debfc3dSmrg  __complex_abs(const __complex__ long double& __z)
6321debfc3dSmrg  { return __c99_cabsl(__z); }
6331debfc3dSmrg
6341debfc3dSmrg  template<typename _Tp>
6351debfc3dSmrg    inline _Tp
6361debfc3dSmrg    abs(const complex<_Tp>& __z) { return __complex_abs(__z.__rep()); }
6371debfc3dSmrg#else
6381debfc3dSmrg  template<typename _Tp>
6391debfc3dSmrg    inline _Tp
6401debfc3dSmrg    abs(const complex<_Tp>& __z) { return __complex_abs(__z); }
6411debfc3dSmrg#endif
6421debfc3dSmrg
6431debfc3dSmrg
6441debfc3dSmrg  // 26.2.7/4: arg(__z): Returns the phase angle of __z.
6451debfc3dSmrg  template<typename _Tp>
6461debfc3dSmrg    inline _Tp
6471debfc3dSmrg    __complex_arg(const complex<_Tp>& __z)
6481debfc3dSmrg    { return  atan2(__z.imag(), __z.real()); }
6491debfc3dSmrg
6501debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
6511debfc3dSmrg  inline float
6521debfc3dSmrg  __complex_arg(__complex__ float __z) { return __builtin_cargf(__z); }
6531debfc3dSmrg
6541debfc3dSmrg  inline double
6551debfc3dSmrg  __complex_arg(__complex__ double __z) { return __builtin_carg(__z); }
6561debfc3dSmrg
6571debfc3dSmrg  inline long double
6581debfc3dSmrg  __complex_arg(const __complex__ long double& __z)
6591debfc3dSmrg  { return __builtin_cargl(__z); }
6601debfc3dSmrg
6611debfc3dSmrg  template<typename _Tp>
6621debfc3dSmrg    inline _Tp
6631debfc3dSmrg    arg(const complex<_Tp>& __z) { return __complex_arg(__z.__rep()); }
6641debfc3dSmrg#else
6651debfc3dSmrg  template<typename _Tp>
6661debfc3dSmrg    inline _Tp
6671debfc3dSmrg    arg(const complex<_Tp>& __z) { return __complex_arg(__z); }
6681debfc3dSmrg#endif
6691debfc3dSmrg
6701debfc3dSmrg  // 26.2.7/5: norm(__z) returns the squared magnitude of __z.
6711debfc3dSmrg  //     As defined, norm() is -not- a norm is the common mathematical
6721debfc3dSmrg  //     sense used in numerics.  The helper class _Norm_helper<> tries to
6731debfc3dSmrg  //     distinguish between builtin floating point and the rest, so as
6741debfc3dSmrg  //     to deliver an answer as close as possible to the real value.
6751debfc3dSmrg  template<bool>
6761debfc3dSmrg    struct _Norm_helper
6771debfc3dSmrg    {
6781debfc3dSmrg      template<typename _Tp>
679c0a68be4Smrg        static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z)
6801debfc3dSmrg        {
6811debfc3dSmrg          const _Tp __x = __z.real();
6821debfc3dSmrg          const _Tp __y = __z.imag();
6831debfc3dSmrg          return __x * __x + __y * __y;
6841debfc3dSmrg        }
6851debfc3dSmrg    };
6861debfc3dSmrg
6871debfc3dSmrg  template<>
6881debfc3dSmrg    struct _Norm_helper<true>
6891debfc3dSmrg    {
6901debfc3dSmrg      template<typename _Tp>
691c0a68be4Smrg        static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(const complex<_Tp>& __z)
6921debfc3dSmrg        {
693c0a68be4Smrg          //_Tp __res = std::abs(__z);
694c0a68be4Smrg          //return __res * __res;
695c0a68be4Smrg          const _Tp __x = __z.real();
696c0a68be4Smrg          const _Tp __y = __z.imag();
697c0a68be4Smrg          return __x * __x + __y * __y;
6981debfc3dSmrg        }
6991debfc3dSmrg    };
7001debfc3dSmrg
7011debfc3dSmrg  template<typename _Tp>
702c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR _Tp
7031debfc3dSmrg    norm(const complex<_Tp>& __z)
7041debfc3dSmrg    {
7051debfc3dSmrg      return _Norm_helper<__is_floating<_Tp>::__value
7061debfc3dSmrg	&& !_GLIBCXX_FAST_MATH>::_S_do_it(__z);
7071debfc3dSmrg    }
7081debfc3dSmrg
7091debfc3dSmrg  template<typename _Tp>
7101debfc3dSmrg    inline complex<_Tp>
7111debfc3dSmrg    polar(const _Tp& __rho, const _Tp& __theta)
7121debfc3dSmrg    {
7131debfc3dSmrg      __glibcxx_assert( __rho >= 0 );
7141debfc3dSmrg      return complex<_Tp>(__rho * cos(__theta), __rho * sin(__theta));
7151debfc3dSmrg    }
7161debfc3dSmrg
7171debfc3dSmrg  template<typename _Tp>
718c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR complex<_Tp>
7191debfc3dSmrg    conj(const complex<_Tp>& __z)
7201debfc3dSmrg    { return complex<_Tp>(__z.real(), -__z.imag()); }
7211debfc3dSmrg
7221debfc3dSmrg  // Transcendentals
7231debfc3dSmrg
7241debfc3dSmrg  // 26.2.8/1 cos(__z):  Returns the cosine of __z.
7251debfc3dSmrg  template<typename _Tp>
7261debfc3dSmrg    inline complex<_Tp>
7271debfc3dSmrg    __complex_cos(const complex<_Tp>& __z)
7281debfc3dSmrg    {
7291debfc3dSmrg      const _Tp __x = __z.real();
7301debfc3dSmrg      const _Tp __y = __z.imag();
7311debfc3dSmrg      return complex<_Tp>(cos(__x) * cosh(__y), -sin(__x) * sinh(__y));
7321debfc3dSmrg    }
7331debfc3dSmrg
7341debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
7351debfc3dSmrg  inline __complex__ float
7361debfc3dSmrg  __complex_cos(__complex__ float __z) { return __builtin_ccosf(__z); }
7371debfc3dSmrg
7381debfc3dSmrg  inline __complex__ double
7391debfc3dSmrg  __complex_cos(__complex__ double __z) { return __builtin_ccos(__z); }
7401debfc3dSmrg
7411debfc3dSmrg  inline __complex__ long double
7421debfc3dSmrg  __complex_cos(const __complex__ long double& __z)
7431debfc3dSmrg  { return __builtin_ccosl(__z); }
7441debfc3dSmrg
7451debfc3dSmrg  template<typename _Tp>
7461debfc3dSmrg    inline complex<_Tp>
7471debfc3dSmrg    cos(const complex<_Tp>& __z) { return __complex_cos(__z.__rep()); }
7481debfc3dSmrg#else
7491debfc3dSmrg  template<typename _Tp>
7501debfc3dSmrg    inline complex<_Tp>
7511debfc3dSmrg    cos(const complex<_Tp>& __z) { return __complex_cos(__z); }
7521debfc3dSmrg#endif
7531debfc3dSmrg
7541debfc3dSmrg  // 26.2.8/2 cosh(__z): Returns the hyperbolic cosine of __z.
7551debfc3dSmrg  template<typename _Tp>
7561debfc3dSmrg    inline complex<_Tp>
7571debfc3dSmrg    __complex_cosh(const complex<_Tp>& __z)
7581debfc3dSmrg    {
7591debfc3dSmrg      const _Tp __x = __z.real();
7601debfc3dSmrg      const _Tp __y = __z.imag();
7611debfc3dSmrg      return complex<_Tp>(cosh(__x) * cos(__y), sinh(__x) * sin(__y));
7621debfc3dSmrg    }
7631debfc3dSmrg
7641debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
7651debfc3dSmrg  inline __complex__ float
7661debfc3dSmrg  __complex_cosh(__complex__ float __z) { return __builtin_ccoshf(__z); }
7671debfc3dSmrg
7681debfc3dSmrg  inline __complex__ double
7691debfc3dSmrg  __complex_cosh(__complex__ double __z) { return __builtin_ccosh(__z); }
7701debfc3dSmrg
7711debfc3dSmrg  inline __complex__ long double
7721debfc3dSmrg  __complex_cosh(const __complex__ long double& __z)
7731debfc3dSmrg  { return __builtin_ccoshl(__z); }
7741debfc3dSmrg
7751debfc3dSmrg  template<typename _Tp>
7761debfc3dSmrg    inline complex<_Tp>
7771debfc3dSmrg    cosh(const complex<_Tp>& __z) { return __complex_cosh(__z.__rep()); }
7781debfc3dSmrg#else
7791debfc3dSmrg  template<typename _Tp>
7801debfc3dSmrg    inline complex<_Tp>
7811debfc3dSmrg    cosh(const complex<_Tp>& __z) { return __complex_cosh(__z); }
7821debfc3dSmrg#endif
7831debfc3dSmrg
7841debfc3dSmrg  // 26.2.8/3 exp(__z): Returns the complex base e exponential of x
7851debfc3dSmrg  template<typename _Tp>
7861debfc3dSmrg    inline complex<_Tp>
7871debfc3dSmrg    __complex_exp(const complex<_Tp>& __z)
7881debfc3dSmrg    { return std::polar<_Tp>(exp(__z.real()), __z.imag()); }
7891debfc3dSmrg
7901debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
7911debfc3dSmrg  inline __complex__ float
7921debfc3dSmrg  __complex_exp(__complex__ float __z) { return __builtin_cexpf(__z); }
7931debfc3dSmrg
7941debfc3dSmrg  inline __complex__ double
7951debfc3dSmrg  __complex_exp(__complex__ double __z) { return __builtin_cexp(__z); }
7961debfc3dSmrg
7971debfc3dSmrg  inline __complex__ long double
7981debfc3dSmrg  __complex_exp(const __complex__ long double& __z)
7991debfc3dSmrg  { return __builtin_cexpl(__z); }
8001debfc3dSmrg
8011debfc3dSmrg  template<typename _Tp>
8021debfc3dSmrg    inline complex<_Tp>
8031debfc3dSmrg    exp(const complex<_Tp>& __z) { return __complex_exp(__z.__rep()); }
8041debfc3dSmrg#else
8051debfc3dSmrg  template<typename _Tp>
8061debfc3dSmrg    inline complex<_Tp>
8071debfc3dSmrg    exp(const complex<_Tp>& __z) { return __complex_exp(__z); }
8081debfc3dSmrg#endif
8091debfc3dSmrg
8101debfc3dSmrg  // 26.2.8/5 log(__z): Returns the natural complex logarithm of __z.
8111debfc3dSmrg  //                    The branch cut is along the negative axis.
8121debfc3dSmrg  template<typename _Tp>
8131debfc3dSmrg    inline complex<_Tp>
8141debfc3dSmrg    __complex_log(const complex<_Tp>& __z)
8151debfc3dSmrg    { return complex<_Tp>(log(std::abs(__z)), std::arg(__z)); }
8161debfc3dSmrg
8171debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
8181debfc3dSmrg  inline __complex__ float
8191debfc3dSmrg  __complex_log(__complex__ float __z) { return __builtin_clogf(__z); }
8201debfc3dSmrg
8211debfc3dSmrg  inline __complex__ double
8221debfc3dSmrg  __complex_log(__complex__ double __z) { return __builtin_clog(__z); }
8231debfc3dSmrg
8241debfc3dSmrg  inline __complex__ long double
8251debfc3dSmrg  __complex_log(const __complex__ long double& __z)
8261debfc3dSmrg  { return __builtin_clogl(__z); }
8271debfc3dSmrg
8281debfc3dSmrg  template<typename _Tp>
8291debfc3dSmrg    inline complex<_Tp>
8301debfc3dSmrg    log(const complex<_Tp>& __z) { return __complex_log(__z.__rep()); }
8311debfc3dSmrg#else
8321debfc3dSmrg  template<typename _Tp>
8331debfc3dSmrg    inline complex<_Tp>
8341debfc3dSmrg    log(const complex<_Tp>& __z) { return __complex_log(__z); }
8351debfc3dSmrg#endif
8361debfc3dSmrg
8371debfc3dSmrg  template<typename _Tp>
8381debfc3dSmrg    inline complex<_Tp>
8391debfc3dSmrg    log10(const complex<_Tp>& __z)
8401debfc3dSmrg    { return std::log(__z) / log(_Tp(10.0)); }
8411debfc3dSmrg
8421debfc3dSmrg  // 26.2.8/10 sin(__z): Returns the sine of __z.
8431debfc3dSmrg  template<typename _Tp>
8441debfc3dSmrg    inline complex<_Tp>
8451debfc3dSmrg    __complex_sin(const complex<_Tp>& __z)
8461debfc3dSmrg    {
8471debfc3dSmrg      const _Tp __x = __z.real();
8481debfc3dSmrg      const _Tp __y = __z.imag();
8491debfc3dSmrg      return complex<_Tp>(sin(__x) * cosh(__y), cos(__x) * sinh(__y));
8501debfc3dSmrg    }
8511debfc3dSmrg
8521debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
8531debfc3dSmrg  inline __complex__ float
8541debfc3dSmrg  __complex_sin(__complex__ float __z) { return __builtin_csinf(__z); }
8551debfc3dSmrg
8561debfc3dSmrg  inline __complex__ double
8571debfc3dSmrg  __complex_sin(__complex__ double __z) { return __builtin_csin(__z); }
8581debfc3dSmrg
8591debfc3dSmrg  inline __complex__ long double
8601debfc3dSmrg  __complex_sin(const __complex__ long double& __z)
8611debfc3dSmrg  { return __builtin_csinl(__z); }
8621debfc3dSmrg
8631debfc3dSmrg  template<typename _Tp>
8641debfc3dSmrg    inline complex<_Tp>
8651debfc3dSmrg    sin(const complex<_Tp>& __z) { return __complex_sin(__z.__rep()); }
8661debfc3dSmrg#else
8671debfc3dSmrg  template<typename _Tp>
8681debfc3dSmrg    inline complex<_Tp>
8691debfc3dSmrg    sin(const complex<_Tp>& __z) { return __complex_sin(__z); }
8701debfc3dSmrg#endif
8711debfc3dSmrg
8721debfc3dSmrg  // 26.2.8/11 sinh(__z): Returns the hyperbolic sine of __z.
8731debfc3dSmrg  template<typename _Tp>
8741debfc3dSmrg    inline complex<_Tp>
8751debfc3dSmrg    __complex_sinh(const complex<_Tp>& __z)
8761debfc3dSmrg    {
8771debfc3dSmrg      const _Tp __x = __z.real();
8781debfc3dSmrg      const _Tp  __y = __z.imag();
8791debfc3dSmrg      return complex<_Tp>(sinh(__x) * cos(__y), cosh(__x) * sin(__y));
8801debfc3dSmrg    }
8811debfc3dSmrg
8821debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
8831debfc3dSmrg  inline __complex__ float
8841debfc3dSmrg  __complex_sinh(__complex__ float __z) { return __builtin_csinhf(__z); }
8851debfc3dSmrg
8861debfc3dSmrg  inline __complex__ double
8871debfc3dSmrg  __complex_sinh(__complex__ double __z) { return __builtin_csinh(__z); }
8881debfc3dSmrg
8891debfc3dSmrg  inline __complex__ long double
8901debfc3dSmrg  __complex_sinh(const __complex__ long double& __z)
8911debfc3dSmrg  { return __builtin_csinhl(__z); }
8921debfc3dSmrg
8931debfc3dSmrg  template<typename _Tp>
8941debfc3dSmrg    inline complex<_Tp>
8951debfc3dSmrg    sinh(const complex<_Tp>& __z) { return __complex_sinh(__z.__rep()); }
8961debfc3dSmrg#else
8971debfc3dSmrg  template<typename _Tp>
8981debfc3dSmrg    inline complex<_Tp>
8991debfc3dSmrg    sinh(const complex<_Tp>& __z) { return __complex_sinh(__z); }
9001debfc3dSmrg#endif
9011debfc3dSmrg
9021debfc3dSmrg  // 26.2.8/13 sqrt(__z): Returns the complex square root of __z.
9031debfc3dSmrg  //                     The branch cut is on the negative axis.
9041debfc3dSmrg  template<typename _Tp>
9051debfc3dSmrg    complex<_Tp>
9061debfc3dSmrg    __complex_sqrt(const complex<_Tp>& __z)
9071debfc3dSmrg    {
9081debfc3dSmrg      _Tp __x = __z.real();
9091debfc3dSmrg      _Tp __y = __z.imag();
9101debfc3dSmrg
9111debfc3dSmrg      if (__x == _Tp())
9121debfc3dSmrg        {
9131debfc3dSmrg          _Tp __t = sqrt(abs(__y) / 2);
9141debfc3dSmrg          return complex<_Tp>(__t, __y < _Tp() ? -__t : __t);
9151debfc3dSmrg        }
9161debfc3dSmrg      else
9171debfc3dSmrg        {
9181debfc3dSmrg          _Tp __t = sqrt(2 * (std::abs(__z) + abs(__x)));
9191debfc3dSmrg          _Tp __u = __t / 2;
9201debfc3dSmrg          return __x > _Tp()
9211debfc3dSmrg            ? complex<_Tp>(__u, __y / __t)
9221debfc3dSmrg            : complex<_Tp>(abs(__y) / __t, __y < _Tp() ? -__u : __u);
9231debfc3dSmrg        }
9241debfc3dSmrg    }
9251debfc3dSmrg
9261debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
9271debfc3dSmrg  inline __complex__ float
9281debfc3dSmrg  __complex_sqrt(__complex__ float __z) { return __builtin_csqrtf(__z); }
9291debfc3dSmrg
9301debfc3dSmrg  inline __complex__ double
9311debfc3dSmrg  __complex_sqrt(__complex__ double __z) { return __builtin_csqrt(__z); }
9321debfc3dSmrg
9331debfc3dSmrg  inline __complex__ long double
9341debfc3dSmrg  __complex_sqrt(const __complex__ long double& __z)
9351debfc3dSmrg  { return __builtin_csqrtl(__z); }
9361debfc3dSmrg
9371debfc3dSmrg  template<typename _Tp>
9381debfc3dSmrg    inline complex<_Tp>
9391debfc3dSmrg    sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z.__rep()); }
9401debfc3dSmrg#else
9411debfc3dSmrg  template<typename _Tp>
9421debfc3dSmrg    inline complex<_Tp>
9431debfc3dSmrg    sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z); }
9441debfc3dSmrg#endif
9451debfc3dSmrg
9461debfc3dSmrg  // 26.2.8/14 tan(__z):  Return the complex tangent of __z.
9471debfc3dSmrg
9481debfc3dSmrg  template<typename _Tp>
9491debfc3dSmrg    inline complex<_Tp>
9501debfc3dSmrg    __complex_tan(const complex<_Tp>& __z)
9511debfc3dSmrg    { return std::sin(__z) / std::cos(__z); }
9521debfc3dSmrg
9531debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
9541debfc3dSmrg  inline __complex__ float
9551debfc3dSmrg  __complex_tan(__complex__ float __z) { return __builtin_ctanf(__z); }
9561debfc3dSmrg
9571debfc3dSmrg  inline __complex__ double
9581debfc3dSmrg  __complex_tan(__complex__ double __z) { return __builtin_ctan(__z); }
9591debfc3dSmrg
9601debfc3dSmrg  inline __complex__ long double
9611debfc3dSmrg  __complex_tan(const __complex__ long double& __z)
9621debfc3dSmrg  { return __builtin_ctanl(__z); }
9631debfc3dSmrg
9641debfc3dSmrg  template<typename _Tp>
9651debfc3dSmrg    inline complex<_Tp>
9661debfc3dSmrg    tan(const complex<_Tp>& __z) { return __complex_tan(__z.__rep()); }
9671debfc3dSmrg#else
9681debfc3dSmrg  template<typename _Tp>
9691debfc3dSmrg    inline complex<_Tp>
9701debfc3dSmrg    tan(const complex<_Tp>& __z) { return __complex_tan(__z); }
9711debfc3dSmrg#endif
9721debfc3dSmrg
9731debfc3dSmrg
9741debfc3dSmrg  // 26.2.8/15 tanh(__z):  Returns the hyperbolic tangent of __z.
9751debfc3dSmrg
9761debfc3dSmrg  template<typename _Tp>
9771debfc3dSmrg    inline complex<_Tp>
9781debfc3dSmrg    __complex_tanh(const complex<_Tp>& __z)
9791debfc3dSmrg    { return std::sinh(__z) / std::cosh(__z); }
9801debfc3dSmrg
9811debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
9821debfc3dSmrg  inline __complex__ float
9831debfc3dSmrg  __complex_tanh(__complex__ float __z) { return __builtin_ctanhf(__z); }
9841debfc3dSmrg
9851debfc3dSmrg  inline __complex__ double
9861debfc3dSmrg  __complex_tanh(__complex__ double __z) { return __builtin_ctanh(__z); }
9871debfc3dSmrg
9881debfc3dSmrg  inline __complex__ long double
9891debfc3dSmrg  __complex_tanh(const __complex__ long double& __z)
9901debfc3dSmrg  { return __builtin_ctanhl(__z); }
9911debfc3dSmrg
9921debfc3dSmrg  template<typename _Tp>
9931debfc3dSmrg    inline complex<_Tp>
9941debfc3dSmrg    tanh(const complex<_Tp>& __z) { return __complex_tanh(__z.__rep()); }
9951debfc3dSmrg#else
9961debfc3dSmrg  template<typename _Tp>
9971debfc3dSmrg    inline complex<_Tp>
9981debfc3dSmrg    tanh(const complex<_Tp>& __z) { return __complex_tanh(__z); }
9991debfc3dSmrg#endif
10001debfc3dSmrg
10011debfc3dSmrg
10021debfc3dSmrg  // 26.2.8/9  pow(__x, __y): Returns the complex power base of __x
10031debfc3dSmrg  //                          raised to the __y-th power.  The branch
10041debfc3dSmrg  //                          cut is on the negative axis.
10051debfc3dSmrg  template<typename _Tp>
10061debfc3dSmrg    complex<_Tp>
10071debfc3dSmrg    __complex_pow_unsigned(complex<_Tp> __x, unsigned __n)
10081debfc3dSmrg    {
10091debfc3dSmrg      complex<_Tp> __y = __n % 2 ? __x : complex<_Tp>(1);
10101debfc3dSmrg
10111debfc3dSmrg      while (__n >>= 1)
10121debfc3dSmrg        {
10131debfc3dSmrg          __x *= __x;
10141debfc3dSmrg          if (__n % 2)
10151debfc3dSmrg            __y *= __x;
10161debfc3dSmrg        }
10171debfc3dSmrg
10181debfc3dSmrg      return __y;
10191debfc3dSmrg    }
10201debfc3dSmrg
10211debfc3dSmrg  // In C++11 mode we used to implement the resolution of
10221debfc3dSmrg  // DR 844. complex pow return type is ambiguous.
10231debfc3dSmrg  // thus the following overload was disabled in that mode.  However, doing
10241debfc3dSmrg  // that causes all sorts of issues, see, for example:
10251debfc3dSmrg  //   http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html
10261debfc3dSmrg  // and also PR57974.
10271debfc3dSmrg  template<typename _Tp>
10281debfc3dSmrg    inline complex<_Tp>
10291debfc3dSmrg    pow(const complex<_Tp>& __z, int __n)
10301debfc3dSmrg    {
10311debfc3dSmrg      return __n < 0
10321debfc3dSmrg	? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n)
10331debfc3dSmrg        : std::__complex_pow_unsigned(__z, __n);
10341debfc3dSmrg    }
10351debfc3dSmrg
10361debfc3dSmrg  template<typename _Tp>
10371debfc3dSmrg    complex<_Tp>
10381debfc3dSmrg    pow(const complex<_Tp>& __x, const _Tp& __y)
10391debfc3dSmrg    {
10401debfc3dSmrg#if ! _GLIBCXX_USE_C99_COMPLEX
10411debfc3dSmrg      if (__x == _Tp())
10421debfc3dSmrg	return _Tp();
10431debfc3dSmrg#endif
10441debfc3dSmrg      if (__x.imag() == _Tp() && __x.real() > _Tp())
10451debfc3dSmrg        return pow(__x.real(), __y);
10461debfc3dSmrg
10471debfc3dSmrg      complex<_Tp> __t = std::log(__x);
10481debfc3dSmrg      return std::polar<_Tp>(exp(__y * __t.real()), __y * __t.imag());
10491debfc3dSmrg    }
10501debfc3dSmrg
10511debfc3dSmrg  template<typename _Tp>
10521debfc3dSmrg    inline complex<_Tp>
10531debfc3dSmrg    __complex_pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
10541debfc3dSmrg    { return __x == _Tp() ? _Tp() : std::exp(__y * std::log(__x)); }
10551debfc3dSmrg
10561debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX
10571debfc3dSmrg  inline __complex__ float
10581debfc3dSmrg  __complex_pow(__complex__ float __x, __complex__ float __y)
10591debfc3dSmrg  { return __builtin_cpowf(__x, __y); }
10601debfc3dSmrg
10611debfc3dSmrg  inline __complex__ double
10621debfc3dSmrg  __complex_pow(__complex__ double __x, __complex__ double __y)
10631debfc3dSmrg  { return __builtin_cpow(__x, __y); }
10641debfc3dSmrg
10651debfc3dSmrg  inline __complex__ long double
10661debfc3dSmrg  __complex_pow(const __complex__ long double& __x,
10671debfc3dSmrg		const __complex__ long double& __y)
10681debfc3dSmrg  { return __builtin_cpowl(__x, __y); }
10691debfc3dSmrg
10701debfc3dSmrg  template<typename _Tp>
10711debfc3dSmrg    inline complex<_Tp>
10721debfc3dSmrg    pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
10731debfc3dSmrg    { return __complex_pow(__x.__rep(), __y.__rep()); }
10741debfc3dSmrg#else
10751debfc3dSmrg  template<typename _Tp>
10761debfc3dSmrg    inline complex<_Tp>
10771debfc3dSmrg    pow(const complex<_Tp>& __x, const complex<_Tp>& __y)
10781debfc3dSmrg    { return __complex_pow(__x, __y); }
10791debfc3dSmrg#endif
10801debfc3dSmrg
10811debfc3dSmrg  template<typename _Tp>
10821debfc3dSmrg    inline complex<_Tp>
10831debfc3dSmrg    pow(const _Tp& __x, const complex<_Tp>& __y)
10841debfc3dSmrg    {
10851debfc3dSmrg      return __x > _Tp() ? std::polar<_Tp>(pow(__x, __y.real()),
10861debfc3dSmrg					   __y.imag() * log(__x))
10871debfc3dSmrg	                 : std::pow(complex<_Tp>(__x), __y);
10881debfc3dSmrg    }
10891debfc3dSmrg
10901debfc3dSmrg  /// 26.2.3  complex specializations
10911debfc3dSmrg  /// complex<float> specialization
10921debfc3dSmrg  template<>
10931debfc3dSmrg    struct complex<float>
10941debfc3dSmrg    {
10951debfc3dSmrg      typedef float value_type;
10961debfc3dSmrg      typedef __complex__ float _ComplexT;
10971debfc3dSmrg
10981debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
10991debfc3dSmrg
11001debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(float __r = 0.0f, float __i = 0.0f)
11011debfc3dSmrg#if __cplusplus >= 201103L
11021debfc3dSmrg      : _M_value{ __r, __i } { }
11031debfc3dSmrg#else
11041debfc3dSmrg      {
11051debfc3dSmrg	__real__ _M_value = __r;
11061debfc3dSmrg	__imag__ _M_value = __i;
11071debfc3dSmrg      }
11081debfc3dSmrg#endif
11091debfc3dSmrg
11101debfc3dSmrg      explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&);
11111debfc3dSmrg      explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
11121debfc3dSmrg
11131debfc3dSmrg#if __cplusplus >= 201103L
11141debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
11151debfc3dSmrg      // DR 387. std::complex over-encapsulated.
11161debfc3dSmrg      __attribute ((__abi_tag__ ("cxx11")))
11171debfc3dSmrg      constexpr float
11181debfc3dSmrg      real() const { return __real__ _M_value; }
11191debfc3dSmrg
11201debfc3dSmrg      __attribute ((__abi_tag__ ("cxx11")))
11211debfc3dSmrg      constexpr float
11221debfc3dSmrg      imag() const { return __imag__ _M_value; }
11231debfc3dSmrg#else
11241debfc3dSmrg      float&
11251debfc3dSmrg      real() { return __real__ _M_value; }
11261debfc3dSmrg
11271debfc3dSmrg      const float&
11281debfc3dSmrg      real() const { return __real__ _M_value; }
11291debfc3dSmrg
11301debfc3dSmrg      float&
11311debfc3dSmrg      imag() { return __imag__ _M_value; }
11321debfc3dSmrg
11331debfc3dSmrg      const float&
11341debfc3dSmrg      imag() const { return __imag__ _M_value; }
11351debfc3dSmrg#endif
11361debfc3dSmrg
11371debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
11381debfc3dSmrg      // DR 387. std::complex over-encapsulated.
1139c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
11401debfc3dSmrg      real(float __val) { __real__ _M_value = __val; }
11411debfc3dSmrg
1142c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
11431debfc3dSmrg      imag(float __val) { __imag__ _M_value = __val; }
11441debfc3dSmrg
1145c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
11461debfc3dSmrg      operator=(float __f)
11471debfc3dSmrg      {
11481debfc3dSmrg	_M_value = __f;
11491debfc3dSmrg	return *this;
11501debfc3dSmrg      }
11511debfc3dSmrg
1152c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
11531debfc3dSmrg      operator+=(float __f)
11541debfc3dSmrg      {
11551debfc3dSmrg	_M_value += __f;
11561debfc3dSmrg	return *this;
11571debfc3dSmrg      }
11581debfc3dSmrg
1159c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
11601debfc3dSmrg      operator-=(float __f)
11611debfc3dSmrg      {
11621debfc3dSmrg	_M_value -= __f;
11631debfc3dSmrg	return *this;
11641debfc3dSmrg      }
11651debfc3dSmrg
1166c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
11671debfc3dSmrg      operator*=(float __f)
11681debfc3dSmrg      {
11691debfc3dSmrg	_M_value *= __f;
11701debfc3dSmrg	return *this;
11711debfc3dSmrg      }
11721debfc3dSmrg
1173c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
11741debfc3dSmrg      operator/=(float __f)
11751debfc3dSmrg      {
11761debfc3dSmrg	_M_value /= __f;
11771debfc3dSmrg	return *this;
11781debfc3dSmrg      }
11791debfc3dSmrg
11801debfc3dSmrg      // Let the compiler synthesize the copy and assignment
11811debfc3dSmrg      // operator.  It always does a pretty good job.
1182c0a68be4Smrg#if __cplusplus >= 201103L
1183c0a68be4Smrg      _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
1184c0a68be4Smrg#endif
11851debfc3dSmrg
11861debfc3dSmrg      template<typename _Tp>
1187c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
11881debfc3dSmrg        operator=(const complex<_Tp>&  __z)
11891debfc3dSmrg	{
11901debfc3dSmrg	  __real__ _M_value = __z.real();
11911debfc3dSmrg	  __imag__ _M_value = __z.imag();
11921debfc3dSmrg	  return *this;
11931debfc3dSmrg	}
11941debfc3dSmrg
11951debfc3dSmrg      template<typename _Tp>
1196c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
11971debfc3dSmrg        operator+=(const complex<_Tp>& __z)
11981debfc3dSmrg	{
1199c0a68be4Smrg	  _M_value += __z.__rep();
12001debfc3dSmrg	  return *this;
12011debfc3dSmrg	}
12021debfc3dSmrg
12031debfc3dSmrg      template<class _Tp>
1204c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
12051debfc3dSmrg        operator-=(const complex<_Tp>& __z)
12061debfc3dSmrg	{
1207c0a68be4Smrg	  _M_value -= __z.__rep();
12081debfc3dSmrg	  return *this;
12091debfc3dSmrg	}
12101debfc3dSmrg
12111debfc3dSmrg      template<class _Tp>
1212c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
12131debfc3dSmrg        operator*=(const complex<_Tp>& __z)
12141debfc3dSmrg	{
1215c0a68be4Smrg	  const _ComplexT __t = __z.__rep();
12161debfc3dSmrg	  _M_value *= __t;
12171debfc3dSmrg	  return *this;
12181debfc3dSmrg	}
12191debfc3dSmrg
12201debfc3dSmrg      template<class _Tp>
1221c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
12221debfc3dSmrg        operator/=(const complex<_Tp>& __z)
12231debfc3dSmrg	{
1224c0a68be4Smrg	  const _ComplexT __t = __z.__rep();
12251debfc3dSmrg	  _M_value /= __t;
12261debfc3dSmrg	  return *this;
12271debfc3dSmrg	}
12281debfc3dSmrg
12291debfc3dSmrg      _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
12301debfc3dSmrg
12311debfc3dSmrg    private:
12321debfc3dSmrg      _ComplexT _M_value;
12331debfc3dSmrg    };
12341debfc3dSmrg
12351debfc3dSmrg  /// 26.2.3  complex specializations
12361debfc3dSmrg  /// complex<double> specialization
12371debfc3dSmrg  template<>
12381debfc3dSmrg    struct complex<double>
12391debfc3dSmrg    {
12401debfc3dSmrg      typedef double value_type;
12411debfc3dSmrg      typedef __complex__ double _ComplexT;
12421debfc3dSmrg
12431debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
12441debfc3dSmrg
12451debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(double __r = 0.0, double __i = 0.0)
12461debfc3dSmrg#if __cplusplus >= 201103L
12471debfc3dSmrg      : _M_value{ __r, __i } { }
12481debfc3dSmrg#else
12491debfc3dSmrg      {
12501debfc3dSmrg	__real__ _M_value = __r;
12511debfc3dSmrg	__imag__ _M_value = __i;
12521debfc3dSmrg      }
12531debfc3dSmrg#endif
12541debfc3dSmrg
12551debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
12561debfc3dSmrg      : _M_value(__z.__rep()) { }
12571debfc3dSmrg
12581debfc3dSmrg      explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
12591debfc3dSmrg
12601debfc3dSmrg#if __cplusplus >= 201103L
12611debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
12621debfc3dSmrg      // DR 387. std::complex over-encapsulated.
12631debfc3dSmrg      __attribute ((__abi_tag__ ("cxx11")))
12641debfc3dSmrg      constexpr double
12651debfc3dSmrg      real() const { return __real__ _M_value; }
12661debfc3dSmrg
12671debfc3dSmrg      __attribute ((__abi_tag__ ("cxx11")))
12681debfc3dSmrg      constexpr double
12691debfc3dSmrg      imag() const { return __imag__ _M_value; }
12701debfc3dSmrg#else
12711debfc3dSmrg      double&
12721debfc3dSmrg      real() { return __real__ _M_value; }
12731debfc3dSmrg
12741debfc3dSmrg      const double&
12751debfc3dSmrg      real() const { return __real__ _M_value; }
12761debfc3dSmrg
12771debfc3dSmrg      double&
12781debfc3dSmrg      imag() { return __imag__ _M_value; }
12791debfc3dSmrg
12801debfc3dSmrg      const double&
12811debfc3dSmrg      imag() const { return __imag__ _M_value; }
12821debfc3dSmrg#endif
12831debfc3dSmrg
12841debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
12851debfc3dSmrg      // DR 387. std::complex over-encapsulated.
1286c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
12871debfc3dSmrg      real(double __val) { __real__ _M_value = __val; }
12881debfc3dSmrg
1289c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
12901debfc3dSmrg      imag(double __val) { __imag__ _M_value = __val; }
12911debfc3dSmrg
1292c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
12931debfc3dSmrg      operator=(double __d)
12941debfc3dSmrg      {
12951debfc3dSmrg	_M_value = __d;
12961debfc3dSmrg	return *this;
12971debfc3dSmrg      }
12981debfc3dSmrg
1299c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
13001debfc3dSmrg      operator+=(double __d)
13011debfc3dSmrg      {
13021debfc3dSmrg	_M_value += __d;
13031debfc3dSmrg	return *this;
13041debfc3dSmrg      }
13051debfc3dSmrg
1306c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
13071debfc3dSmrg      operator-=(double __d)
13081debfc3dSmrg      {
13091debfc3dSmrg	_M_value -= __d;
13101debfc3dSmrg	return *this;
13111debfc3dSmrg      }
13121debfc3dSmrg
1313c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
13141debfc3dSmrg      operator*=(double __d)
13151debfc3dSmrg      {
13161debfc3dSmrg	_M_value *= __d;
13171debfc3dSmrg	return *this;
13181debfc3dSmrg      }
13191debfc3dSmrg
1320c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
13211debfc3dSmrg      operator/=(double __d)
13221debfc3dSmrg      {
13231debfc3dSmrg	_M_value /= __d;
13241debfc3dSmrg	return *this;
13251debfc3dSmrg      }
13261debfc3dSmrg
13271debfc3dSmrg      // The compiler will synthesize this, efficiently.
1328c0a68be4Smrg#if __cplusplus >= 201103L
1329c0a68be4Smrg      _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
1330c0a68be4Smrg#endif
13311debfc3dSmrg
13321debfc3dSmrg      template<typename _Tp>
1333c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
13341debfc3dSmrg        operator=(const complex<_Tp>& __z)
13351debfc3dSmrg	{
1336c0a68be4Smrg	  _M_value = __z.__rep();
13371debfc3dSmrg	  return *this;
13381debfc3dSmrg	}
13391debfc3dSmrg
13401debfc3dSmrg      template<typename _Tp>
1341c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
13421debfc3dSmrg        operator+=(const complex<_Tp>& __z)
13431debfc3dSmrg	{
1344c0a68be4Smrg	  _M_value += __z.__rep();
13451debfc3dSmrg	  return *this;
13461debfc3dSmrg	}
13471debfc3dSmrg
13481debfc3dSmrg      template<typename _Tp>
1349c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
13501debfc3dSmrg        operator-=(const complex<_Tp>& __z)
13511debfc3dSmrg	{
1352c0a68be4Smrg	  _M_value -= __z.__rep();
13531debfc3dSmrg	  return *this;
13541debfc3dSmrg	}
13551debfc3dSmrg
13561debfc3dSmrg      template<typename _Tp>
1357c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
13581debfc3dSmrg        operator*=(const complex<_Tp>& __z)
13591debfc3dSmrg	{
1360c0a68be4Smrg	  const _ComplexT __t = __z.__rep();
13611debfc3dSmrg	  _M_value *= __t;
13621debfc3dSmrg	  return *this;
13631debfc3dSmrg	}
13641debfc3dSmrg
13651debfc3dSmrg      template<typename _Tp>
1366c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
13671debfc3dSmrg        operator/=(const complex<_Tp>& __z)
13681debfc3dSmrg	{
1369c0a68be4Smrg	  const _ComplexT __t = __z.__rep();
13701debfc3dSmrg	  _M_value /= __t;
13711debfc3dSmrg	  return *this;
13721debfc3dSmrg	}
13731debfc3dSmrg
13741debfc3dSmrg      _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
13751debfc3dSmrg
13761debfc3dSmrg    private:
13771debfc3dSmrg      _ComplexT _M_value;
13781debfc3dSmrg    };
13791debfc3dSmrg
13801debfc3dSmrg  /// 26.2.3  complex specializations
13811debfc3dSmrg  /// complex<long double> specialization
13821debfc3dSmrg  template<>
13831debfc3dSmrg    struct complex<long double>
13841debfc3dSmrg    {
13851debfc3dSmrg      typedef long double value_type;
13861debfc3dSmrg      typedef __complex__ long double _ComplexT;
13871debfc3dSmrg
13881debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { }
13891debfc3dSmrg
13901debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(long double __r = 0.0L,
13911debfc3dSmrg				 long double __i = 0.0L)
13921debfc3dSmrg#if __cplusplus >= 201103L
13931debfc3dSmrg      : _M_value{ __r, __i } { }
13941debfc3dSmrg#else
13951debfc3dSmrg      {
13961debfc3dSmrg	__real__ _M_value = __r;
13971debfc3dSmrg	__imag__ _M_value = __i;
13981debfc3dSmrg      }
13991debfc3dSmrg#endif
14001debfc3dSmrg
14011debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(const complex<float>& __z)
14021debfc3dSmrg      : _M_value(__z.__rep()) { }
14031debfc3dSmrg
14041debfc3dSmrg      _GLIBCXX_CONSTEXPR complex(const complex<double>& __z)
14051debfc3dSmrg      : _M_value(__z.__rep()) { }
14061debfc3dSmrg
14071debfc3dSmrg#if __cplusplus >= 201103L
14081debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
14091debfc3dSmrg      // DR 387. std::complex over-encapsulated.
14101debfc3dSmrg      __attribute ((__abi_tag__ ("cxx11")))
14111debfc3dSmrg      constexpr long double
14121debfc3dSmrg      real() const { return __real__ _M_value; }
14131debfc3dSmrg
14141debfc3dSmrg      __attribute ((__abi_tag__ ("cxx11")))
14151debfc3dSmrg      constexpr long double
14161debfc3dSmrg      imag() const { return __imag__ _M_value; }
14171debfc3dSmrg#else
14181debfc3dSmrg      long double&
14191debfc3dSmrg      real() { return __real__ _M_value; }
14201debfc3dSmrg
14211debfc3dSmrg      const long double&
14221debfc3dSmrg      real() const { return __real__ _M_value; }
14231debfc3dSmrg
14241debfc3dSmrg      long double&
14251debfc3dSmrg      imag() { return __imag__ _M_value; }
14261debfc3dSmrg
14271debfc3dSmrg      const long double&
14281debfc3dSmrg      imag() const { return __imag__ _M_value; }
14291debfc3dSmrg#endif
14301debfc3dSmrg
14311debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
14321debfc3dSmrg      // DR 387. std::complex over-encapsulated.
1433c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
14341debfc3dSmrg      real(long double __val) { __real__ _M_value = __val; }
14351debfc3dSmrg
1436c0a68be4Smrg      _GLIBCXX20_CONSTEXPR void
14371debfc3dSmrg      imag(long double __val) { __imag__ _M_value = __val; }
14381debfc3dSmrg
1439c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
14401debfc3dSmrg      operator=(long double __r)
14411debfc3dSmrg      {
14421debfc3dSmrg	_M_value = __r;
14431debfc3dSmrg	return *this;
14441debfc3dSmrg      }
14451debfc3dSmrg
1446c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
14471debfc3dSmrg      operator+=(long double __r)
14481debfc3dSmrg      {
14491debfc3dSmrg	_M_value += __r;
14501debfc3dSmrg	return *this;
14511debfc3dSmrg      }
14521debfc3dSmrg
1453c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
14541debfc3dSmrg      operator-=(long double __r)
14551debfc3dSmrg      {
14561debfc3dSmrg	_M_value -= __r;
14571debfc3dSmrg	return *this;
14581debfc3dSmrg      }
14591debfc3dSmrg
1460c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
14611debfc3dSmrg      operator*=(long double __r)
14621debfc3dSmrg      {
14631debfc3dSmrg	_M_value *= __r;
14641debfc3dSmrg	return *this;
14651debfc3dSmrg      }
14661debfc3dSmrg
1467c0a68be4Smrg      _GLIBCXX20_CONSTEXPR complex&
14681debfc3dSmrg      operator/=(long double __r)
14691debfc3dSmrg      {
14701debfc3dSmrg	_M_value /= __r;
14711debfc3dSmrg	return *this;
14721debfc3dSmrg      }
14731debfc3dSmrg
14741debfc3dSmrg      // The compiler knows how to do this efficiently
1475c0a68be4Smrg#if __cplusplus >= 201103L
1476c0a68be4Smrg      _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
1477c0a68be4Smrg#endif
14781debfc3dSmrg
14791debfc3dSmrg      template<typename _Tp>
1480c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
14811debfc3dSmrg        operator=(const complex<_Tp>& __z)
14821debfc3dSmrg	{
1483c0a68be4Smrg	  _M_value = __z.__rep();
14841debfc3dSmrg	  return *this;
14851debfc3dSmrg	}
14861debfc3dSmrg
14871debfc3dSmrg      template<typename _Tp>
1488c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
14891debfc3dSmrg	operator+=(const complex<_Tp>& __z)
14901debfc3dSmrg	{
1491c0a68be4Smrg	  _M_value += __z.__rep();
14921debfc3dSmrg	  return *this;
14931debfc3dSmrg	}
14941debfc3dSmrg
14951debfc3dSmrg      template<typename _Tp>
1496c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
14971debfc3dSmrg	operator-=(const complex<_Tp>& __z)
14981debfc3dSmrg	{
1499c0a68be4Smrg	  _M_value -= __z.__rep();
15001debfc3dSmrg	  return *this;
15011debfc3dSmrg	}
15021debfc3dSmrg
15031debfc3dSmrg      template<typename _Tp>
1504c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
15051debfc3dSmrg	operator*=(const complex<_Tp>& __z)
15061debfc3dSmrg	{
1507c0a68be4Smrg	  const _ComplexT __t = __z.__rep();
15081debfc3dSmrg	  _M_value *= __t;
15091debfc3dSmrg	  return *this;
15101debfc3dSmrg	}
15111debfc3dSmrg
15121debfc3dSmrg      template<typename _Tp>
1513c0a68be4Smrg        _GLIBCXX20_CONSTEXPR complex&
15141debfc3dSmrg	operator/=(const complex<_Tp>& __z)
15151debfc3dSmrg	{
1516c0a68be4Smrg	  const _ComplexT __t = __z.__rep();
15171debfc3dSmrg	  _M_value /= __t;
15181debfc3dSmrg	  return *this;
15191debfc3dSmrg	}
15201debfc3dSmrg
15211debfc3dSmrg      _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }
15221debfc3dSmrg
15231debfc3dSmrg    private:
15241debfc3dSmrg      _ComplexT _M_value;
15251debfc3dSmrg    };
15261debfc3dSmrg
15271debfc3dSmrg  // These bits have to be at the end of this file, so that the
15281debfc3dSmrg  // specializations have all been defined.
15291debfc3dSmrg  inline _GLIBCXX_CONSTEXPR
15301debfc3dSmrg  complex<float>::complex(const complex<double>& __z)
15311debfc3dSmrg  : _M_value(__z.__rep()) { }
15321debfc3dSmrg
15331debfc3dSmrg  inline _GLIBCXX_CONSTEXPR
15341debfc3dSmrg  complex<float>::complex(const complex<long double>& __z)
15351debfc3dSmrg  : _M_value(__z.__rep()) { }
15361debfc3dSmrg
15371debfc3dSmrg  inline _GLIBCXX_CONSTEXPR
15381debfc3dSmrg  complex<double>::complex(const complex<long double>& __z)
15391debfc3dSmrg  : _M_value(__z.__rep()) { }
15401debfc3dSmrg
15411debfc3dSmrg  // Inhibit implicit instantiations for required instantiations,
15421debfc3dSmrg  // which are defined via explicit instantiations elsewhere.
15431debfc3dSmrg  // NB:  This syntax is a GNU extension.
15441debfc3dSmrg#if _GLIBCXX_EXTERN_TEMPLATE
15451debfc3dSmrg  extern template istream& operator>>(istream&, complex<float>&);
15461debfc3dSmrg  extern template ostream& operator<<(ostream&, const complex<float>&);
15471debfc3dSmrg  extern template istream& operator>>(istream&, complex<double>&);
15481debfc3dSmrg  extern template ostream& operator<<(ostream&, const complex<double>&);
15491debfc3dSmrg  extern template istream& operator>>(istream&, complex<long double>&);
15501debfc3dSmrg  extern template ostream& operator<<(ostream&, const complex<long double>&);
15511debfc3dSmrg
15521debfc3dSmrg#ifdef _GLIBCXX_USE_WCHAR_T
15531debfc3dSmrg  extern template wistream& operator>>(wistream&, complex<float>&);
15541debfc3dSmrg  extern template wostream& operator<<(wostream&, const complex<float>&);
15551debfc3dSmrg  extern template wistream& operator>>(wistream&, complex<double>&);
15561debfc3dSmrg  extern template wostream& operator<<(wostream&, const complex<double>&);
15571debfc3dSmrg  extern template wistream& operator>>(wistream&, complex<long double>&);
15581debfc3dSmrg  extern template wostream& operator<<(wostream&, const complex<long double>&);
15591debfc3dSmrg#endif
15601debfc3dSmrg#endif
15611debfc3dSmrg
1562*8feb0f0bSmrg  /// @} group complex_numbers
15631debfc3dSmrg
15641debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION
15651debfc3dSmrg} // namespace
15661debfc3dSmrg
15671debfc3dSmrgnamespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
15681debfc3dSmrg{
15691debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
15701debfc3dSmrg
15711debfc3dSmrg  // See ext/type_traits.h for the primary template.
15721debfc3dSmrg  template<typename _Tp, typename _Up>
15731debfc3dSmrg    struct __promote_2<std::complex<_Tp>, _Up>
15741debfc3dSmrg    {
15751debfc3dSmrg    public:
15761debfc3dSmrg      typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
15771debfc3dSmrg    };
15781debfc3dSmrg
15791debfc3dSmrg  template<typename _Tp, typename _Up>
15801debfc3dSmrg    struct __promote_2<_Tp, std::complex<_Up> >
15811debfc3dSmrg    {
15821debfc3dSmrg    public:
15831debfc3dSmrg      typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
15841debfc3dSmrg    };
15851debfc3dSmrg
15861debfc3dSmrg  template<typename _Tp, typename _Up>
15871debfc3dSmrg    struct __promote_2<std::complex<_Tp>, std::complex<_Up> >
15881debfc3dSmrg    {
15891debfc3dSmrg    public:
15901debfc3dSmrg      typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
15911debfc3dSmrg    };
15921debfc3dSmrg
15931debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION
15941debfc3dSmrg} // namespace
15951debfc3dSmrg
15961debfc3dSmrg#if __cplusplus >= 201103L
15971debfc3dSmrg
15981debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default)
15991debfc3dSmrg{
16001debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
16011debfc3dSmrg
16021debfc3dSmrg  // Forward declarations.
16031debfc3dSmrg  template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&);
16041debfc3dSmrg  template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&);
16051debfc3dSmrg  template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&);
16061debfc3dSmrg
16071debfc3dSmrg  template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&);
16081debfc3dSmrg  template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&);
16091debfc3dSmrg  template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&);
16101debfc3dSmrg  // DR 595.
16111debfc3dSmrg  template<typename _Tp> _Tp               fabs(const std::complex<_Tp>&);
16121debfc3dSmrg
16131debfc3dSmrg  template<typename _Tp>
16141debfc3dSmrg    inline std::complex<_Tp>
16151debfc3dSmrg    __complex_acos(const std::complex<_Tp>& __z)
16161debfc3dSmrg    {
16171debfc3dSmrg      const std::complex<_Tp> __t = std::asin(__z);
16181debfc3dSmrg      const _Tp __pi_2 = 1.5707963267948966192313216916397514L;
16191debfc3dSmrg      return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
16201debfc3dSmrg    }
16211debfc3dSmrg
16221debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX_TR1
16231debfc3dSmrg  inline __complex__ float
16241debfc3dSmrg  __complex_acos(__complex__ float __z)
16251debfc3dSmrg  { return __builtin_cacosf(__z); }
16261debfc3dSmrg
16271debfc3dSmrg  inline __complex__ double
16281debfc3dSmrg  __complex_acos(__complex__ double __z)
16291debfc3dSmrg  { return __builtin_cacos(__z); }
16301debfc3dSmrg
16311debfc3dSmrg  inline __complex__ long double
16321debfc3dSmrg  __complex_acos(const __complex__ long double& __z)
16331debfc3dSmrg  { return __builtin_cacosl(__z); }
16341debfc3dSmrg
16351debfc3dSmrg  template<typename _Tp>
16361debfc3dSmrg    inline std::complex<_Tp>
16371debfc3dSmrg    acos(const std::complex<_Tp>& __z)
16381debfc3dSmrg    { return __complex_acos(__z.__rep()); }
16391debfc3dSmrg#else
16401debfc3dSmrg  /// acos(__z) [8.1.2].
16411debfc3dSmrg  //  Effects:  Behaves the same as C99 function cacos, defined
16421debfc3dSmrg  //            in subclause 7.3.5.1.
16431debfc3dSmrg  template<typename _Tp>
16441debfc3dSmrg    inline std::complex<_Tp>
16451debfc3dSmrg    acos(const std::complex<_Tp>& __z)
16461debfc3dSmrg    { return __complex_acos(__z); }
16471debfc3dSmrg#endif
16481debfc3dSmrg
16491debfc3dSmrg  template<typename _Tp>
16501debfc3dSmrg    inline std::complex<_Tp>
16511debfc3dSmrg    __complex_asin(const std::complex<_Tp>& __z)
16521debfc3dSmrg    {
16531debfc3dSmrg      std::complex<_Tp> __t(-__z.imag(), __z.real());
16541debfc3dSmrg      __t = std::asinh(__t);
16551debfc3dSmrg      return std::complex<_Tp>(__t.imag(), -__t.real());
16561debfc3dSmrg    }
16571debfc3dSmrg
16581debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX_TR1
16591debfc3dSmrg  inline __complex__ float
16601debfc3dSmrg  __complex_asin(__complex__ float __z)
16611debfc3dSmrg  { return __builtin_casinf(__z); }
16621debfc3dSmrg
16631debfc3dSmrg  inline __complex__ double
16641debfc3dSmrg  __complex_asin(__complex__ double __z)
16651debfc3dSmrg  { return __builtin_casin(__z); }
16661debfc3dSmrg
16671debfc3dSmrg  inline __complex__ long double
16681debfc3dSmrg  __complex_asin(const __complex__ long double& __z)
16691debfc3dSmrg  { return __builtin_casinl(__z); }
16701debfc3dSmrg
16711debfc3dSmrg  template<typename _Tp>
16721debfc3dSmrg    inline std::complex<_Tp>
16731debfc3dSmrg    asin(const std::complex<_Tp>& __z)
16741debfc3dSmrg    { return __complex_asin(__z.__rep()); }
16751debfc3dSmrg#else
16761debfc3dSmrg  /// asin(__z) [8.1.3].
16771debfc3dSmrg  //  Effects:  Behaves the same as C99 function casin, defined
16781debfc3dSmrg  //            in subclause 7.3.5.2.
16791debfc3dSmrg  template<typename _Tp>
16801debfc3dSmrg    inline std::complex<_Tp>
16811debfc3dSmrg    asin(const std::complex<_Tp>& __z)
16821debfc3dSmrg    { return __complex_asin(__z); }
16831debfc3dSmrg#endif
16841debfc3dSmrg
16851debfc3dSmrg  template<typename _Tp>
16861debfc3dSmrg    std::complex<_Tp>
16871debfc3dSmrg    __complex_atan(const std::complex<_Tp>& __z)
16881debfc3dSmrg    {
16891debfc3dSmrg      const _Tp __r2 = __z.real() * __z.real();
16901debfc3dSmrg      const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
16911debfc3dSmrg
16921debfc3dSmrg      _Tp __num = __z.imag() + _Tp(1.0);
16931debfc3dSmrg      _Tp __den = __z.imag() - _Tp(1.0);
16941debfc3dSmrg
16951debfc3dSmrg      __num = __r2 + __num * __num;
16961debfc3dSmrg      __den = __r2 + __den * __den;
16971debfc3dSmrg
16981debfc3dSmrg      return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x),
16991debfc3dSmrg			       _Tp(0.25) * log(__num / __den));
17001debfc3dSmrg    }
17011debfc3dSmrg
17021debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX_TR1
17031debfc3dSmrg  inline __complex__ float
17041debfc3dSmrg  __complex_atan(__complex__ float __z)
17051debfc3dSmrg  { return __builtin_catanf(__z); }
17061debfc3dSmrg
17071debfc3dSmrg  inline __complex__ double
17081debfc3dSmrg  __complex_atan(__complex__ double __z)
17091debfc3dSmrg  { return __builtin_catan(__z); }
17101debfc3dSmrg
17111debfc3dSmrg  inline __complex__ long double
17121debfc3dSmrg  __complex_atan(const __complex__ long double& __z)
17131debfc3dSmrg  { return __builtin_catanl(__z); }
17141debfc3dSmrg
17151debfc3dSmrg  template<typename _Tp>
17161debfc3dSmrg    inline std::complex<_Tp>
17171debfc3dSmrg    atan(const std::complex<_Tp>& __z)
17181debfc3dSmrg    { return __complex_atan(__z.__rep()); }
17191debfc3dSmrg#else
17201debfc3dSmrg  /// atan(__z) [8.1.4].
17211debfc3dSmrg  //  Effects:  Behaves the same as C99 function catan, defined
17221debfc3dSmrg  //            in subclause 7.3.5.3.
17231debfc3dSmrg  template<typename _Tp>
17241debfc3dSmrg    inline std::complex<_Tp>
17251debfc3dSmrg    atan(const std::complex<_Tp>& __z)
17261debfc3dSmrg    { return __complex_atan(__z); }
17271debfc3dSmrg#endif
17281debfc3dSmrg
17291debfc3dSmrg  template<typename _Tp>
17301debfc3dSmrg    std::complex<_Tp>
17311debfc3dSmrg    __complex_acosh(const std::complex<_Tp>& __z)
17321debfc3dSmrg    {
17331debfc3dSmrg      // Kahan's formula.
17341debfc3dSmrg      return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0)))
17351debfc3dSmrg				 + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
17361debfc3dSmrg    }
17371debfc3dSmrg
17381debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX_TR1
17391debfc3dSmrg  inline __complex__ float
17401debfc3dSmrg  __complex_acosh(__complex__ float __z)
17411debfc3dSmrg  { return __builtin_cacoshf(__z); }
17421debfc3dSmrg
17431debfc3dSmrg  inline __complex__ double
17441debfc3dSmrg  __complex_acosh(__complex__ double __z)
17451debfc3dSmrg  { return __builtin_cacosh(__z); }
17461debfc3dSmrg
17471debfc3dSmrg  inline __complex__ long double
17481debfc3dSmrg  __complex_acosh(const __complex__ long double& __z)
17491debfc3dSmrg  { return __builtin_cacoshl(__z); }
17501debfc3dSmrg
17511debfc3dSmrg  template<typename _Tp>
17521debfc3dSmrg    inline std::complex<_Tp>
17531debfc3dSmrg    acosh(const std::complex<_Tp>& __z)
17541debfc3dSmrg    { return __complex_acosh(__z.__rep()); }
17551debfc3dSmrg#else
17561debfc3dSmrg  /// acosh(__z) [8.1.5].
17571debfc3dSmrg  //  Effects:  Behaves the same as C99 function cacosh, defined
17581debfc3dSmrg  //            in subclause 7.3.6.1.
17591debfc3dSmrg  template<typename _Tp>
17601debfc3dSmrg    inline std::complex<_Tp>
17611debfc3dSmrg    acosh(const std::complex<_Tp>& __z)
17621debfc3dSmrg    { return __complex_acosh(__z); }
17631debfc3dSmrg#endif
17641debfc3dSmrg
17651debfc3dSmrg  template<typename _Tp>
17661debfc3dSmrg    std::complex<_Tp>
17671debfc3dSmrg    __complex_asinh(const std::complex<_Tp>& __z)
17681debfc3dSmrg    {
17691debfc3dSmrg      std::complex<_Tp> __t((__z.real() - __z.imag())
17701debfc3dSmrg			    * (__z.real() + __z.imag()) + _Tp(1.0),
17711debfc3dSmrg			    _Tp(2.0) * __z.real() * __z.imag());
17721debfc3dSmrg      __t = std::sqrt(__t);
17731debfc3dSmrg
17741debfc3dSmrg      return std::log(__t + __z);
17751debfc3dSmrg    }
17761debfc3dSmrg
17771debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX_TR1
17781debfc3dSmrg  inline __complex__ float
17791debfc3dSmrg  __complex_asinh(__complex__ float __z)
17801debfc3dSmrg  { return __builtin_casinhf(__z); }
17811debfc3dSmrg
17821debfc3dSmrg  inline __complex__ double
17831debfc3dSmrg  __complex_asinh(__complex__ double __z)
17841debfc3dSmrg  { return __builtin_casinh(__z); }
17851debfc3dSmrg
17861debfc3dSmrg  inline __complex__ long double
17871debfc3dSmrg  __complex_asinh(const __complex__ long double& __z)
17881debfc3dSmrg  { return __builtin_casinhl(__z); }
17891debfc3dSmrg
17901debfc3dSmrg  template<typename _Tp>
17911debfc3dSmrg    inline std::complex<_Tp>
17921debfc3dSmrg    asinh(const std::complex<_Tp>& __z)
17931debfc3dSmrg    { return __complex_asinh(__z.__rep()); }
17941debfc3dSmrg#else
17951debfc3dSmrg  /// asinh(__z) [8.1.6].
17961debfc3dSmrg  //  Effects:  Behaves the same as C99 function casin, defined
17971debfc3dSmrg  //            in subclause 7.3.6.2.
17981debfc3dSmrg  template<typename _Tp>
17991debfc3dSmrg    inline std::complex<_Tp>
18001debfc3dSmrg    asinh(const std::complex<_Tp>& __z)
18011debfc3dSmrg    { return __complex_asinh(__z); }
18021debfc3dSmrg#endif
18031debfc3dSmrg
18041debfc3dSmrg  template<typename _Tp>
18051debfc3dSmrg    std::complex<_Tp>
18061debfc3dSmrg    __complex_atanh(const std::complex<_Tp>& __z)
18071debfc3dSmrg    {
18081debfc3dSmrg      const _Tp __i2 = __z.imag() * __z.imag();
18091debfc3dSmrg      const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
18101debfc3dSmrg
18111debfc3dSmrg      _Tp __num = _Tp(1.0) + __z.real();
18121debfc3dSmrg      _Tp __den = _Tp(1.0) - __z.real();
18131debfc3dSmrg
18141debfc3dSmrg      __num = __i2 + __num * __num;
18151debfc3dSmrg      __den = __i2 + __den * __den;
18161debfc3dSmrg
18171debfc3dSmrg      return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)),
18181debfc3dSmrg			       _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
18191debfc3dSmrg    }
18201debfc3dSmrg
18211debfc3dSmrg#if _GLIBCXX_USE_C99_COMPLEX_TR1
18221debfc3dSmrg  inline __complex__ float
18231debfc3dSmrg  __complex_atanh(__complex__ float __z)
18241debfc3dSmrg  { return __builtin_catanhf(__z); }
18251debfc3dSmrg
18261debfc3dSmrg  inline __complex__ double
18271debfc3dSmrg  __complex_atanh(__complex__ double __z)
18281debfc3dSmrg  { return __builtin_catanh(__z); }
18291debfc3dSmrg
18301debfc3dSmrg  inline __complex__ long double
18311debfc3dSmrg  __complex_atanh(const __complex__ long double& __z)
18321debfc3dSmrg  { return __builtin_catanhl(__z); }
18331debfc3dSmrg
18341debfc3dSmrg  template<typename _Tp>
18351debfc3dSmrg    inline std::complex<_Tp>
18361debfc3dSmrg    atanh(const std::complex<_Tp>& __z)
18371debfc3dSmrg    { return __complex_atanh(__z.__rep()); }
18381debfc3dSmrg#else
18391debfc3dSmrg  /// atanh(__z) [8.1.7].
18401debfc3dSmrg  //  Effects:  Behaves the same as C99 function catanh, defined
18411debfc3dSmrg  //            in subclause 7.3.6.3.
18421debfc3dSmrg  template<typename _Tp>
18431debfc3dSmrg    inline std::complex<_Tp>
18441debfc3dSmrg    atanh(const std::complex<_Tp>& __z)
18451debfc3dSmrg    { return __complex_atanh(__z); }
18461debfc3dSmrg#endif
18471debfc3dSmrg
18481debfc3dSmrg  template<typename _Tp>
18491debfc3dSmrg    inline _Tp
18501debfc3dSmrg    /// fabs(__z) [8.1.8].
18511debfc3dSmrg    //  Effects:  Behaves the same as C99 function cabs, defined
18521debfc3dSmrg    //            in subclause 7.3.8.1.
18531debfc3dSmrg    fabs(const std::complex<_Tp>& __z)
18541debfc3dSmrg    { return std::abs(__z); }
18551debfc3dSmrg
18561debfc3dSmrg  /// Additional overloads [8.1.9].
18571debfc3dSmrg  template<typename _Tp>
18581debfc3dSmrg    inline typename __gnu_cxx::__promote<_Tp>::__type
18591debfc3dSmrg    arg(_Tp __x)
18601debfc3dSmrg    {
18611debfc3dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
18621debfc3dSmrg#if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC)
18631debfc3dSmrg      return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L)
18641debfc3dSmrg	                       : __type();
18651debfc3dSmrg#else
18661debfc3dSmrg      return std::arg(std::complex<__type>(__x));
18671debfc3dSmrg#endif
18681debfc3dSmrg    }
18691debfc3dSmrg
18701debfc3dSmrg  template<typename _Tp>
18711debfc3dSmrg    _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
18721debfc3dSmrg    imag(_Tp)
18731debfc3dSmrg    { return _Tp(); }
18741debfc3dSmrg
18751debfc3dSmrg  template<typename _Tp>
1876c0a68be4Smrg    _GLIBCXX20_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
18771debfc3dSmrg    norm(_Tp __x)
18781debfc3dSmrg    {
18791debfc3dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
18801debfc3dSmrg      return __type(__x) * __type(__x);
18811debfc3dSmrg    }
18821debfc3dSmrg
18831debfc3dSmrg  template<typename _Tp>
18841debfc3dSmrg    _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
18851debfc3dSmrg    real(_Tp __x)
18861debfc3dSmrg    { return __x; }
18871debfc3dSmrg
18881debfc3dSmrg  template<typename _Tp, typename _Up>
18891debfc3dSmrg    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
18901debfc3dSmrg    pow(const std::complex<_Tp>& __x, const _Up& __y)
18911debfc3dSmrg    {
18921debfc3dSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
18931debfc3dSmrg      return std::pow(std::complex<__type>(__x), __type(__y));
18941debfc3dSmrg    }
18951debfc3dSmrg
18961debfc3dSmrg  template<typename _Tp, typename _Up>
18971debfc3dSmrg    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
18981debfc3dSmrg    pow(const _Tp& __x, const std::complex<_Up>& __y)
18991debfc3dSmrg    {
19001debfc3dSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
19011debfc3dSmrg      return std::pow(__type(__x), std::complex<__type>(__y));
19021debfc3dSmrg    }
19031debfc3dSmrg
19041debfc3dSmrg  template<typename _Tp, typename _Up>
19051debfc3dSmrg    inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
19061debfc3dSmrg    pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y)
19071debfc3dSmrg    {
19081debfc3dSmrg      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
19091debfc3dSmrg      return std::pow(std::complex<__type>(__x),
19101debfc3dSmrg		      std::complex<__type>(__y));
19111debfc3dSmrg    }
19121debfc3dSmrg
19131debfc3dSmrg  // Forward declarations.
19141debfc3dSmrg  // DR 781.
19151debfc3dSmrg  template<typename _Tp>
1916c0a68be4Smrg    std::complex<_Tp> proj(const std::complex<_Tp>&);
19171debfc3dSmrg
1918c0a68be4Smrg  // Generic implementation of std::proj, does not work for infinities.
19191debfc3dSmrg  template<typename _Tp>
19201debfc3dSmrg    inline std::complex<_Tp>
1921c0a68be4Smrg    __complex_proj(const std::complex<_Tp>& __z)
1922c0a68be4Smrg    { return __z; }
1923c0a68be4Smrg
1924c0a68be4Smrg#if _GLIBCXX_USE_C99_COMPLEX
1925c0a68be4Smrg  inline complex<float>
1926c0a68be4Smrg  __complex_proj(const complex<float>& __z)
1927c0a68be4Smrg  { return __builtin_cprojf(__z.__rep()); }
1928c0a68be4Smrg
1929c0a68be4Smrg  inline complex<double>
1930c0a68be4Smrg  __complex_proj(const complex<double>& __z)
1931c0a68be4Smrg  { return __builtin_cproj(__z.__rep()); }
1932c0a68be4Smrg
1933c0a68be4Smrg  inline complex<long double>
1934c0a68be4Smrg  __complex_proj(const complex<long double>& __z)
1935c0a68be4Smrg  { return __builtin_cprojl(__z.__rep()); }
1936c0a68be4Smrg#elif defined _GLIBCXX_USE_C99_MATH_TR1
1937c0a68be4Smrg  inline complex<float>
1938c0a68be4Smrg  __complex_proj(const complex<float>& __z)
1939c0a68be4Smrg  {
1940c0a68be4Smrg    if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
1941c0a68be4Smrg      return complex<float>(__builtin_inff(),
1942c0a68be4Smrg			    __builtin_copysignf(0.0f, __z.imag()));
1943c0a68be4Smrg    return __z;
1944c0a68be4Smrg  }
1945c0a68be4Smrg
1946c0a68be4Smrg  inline complex<double>
1947c0a68be4Smrg  __complex_proj(const complex<double>& __z)
1948c0a68be4Smrg  {
1949c0a68be4Smrg    if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
1950c0a68be4Smrg      return complex<double>(__builtin_inf(),
1951c0a68be4Smrg			     __builtin_copysign(0.0, __z.imag()));
1952c0a68be4Smrg    return __z;
1953c0a68be4Smrg  }
1954c0a68be4Smrg
1955c0a68be4Smrg  inline complex<long double>
1956c0a68be4Smrg  __complex_proj(const complex<long double>& __z)
1957c0a68be4Smrg  {
1958c0a68be4Smrg    if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
1959c0a68be4Smrg      return complex<long double>(__builtin_infl(),
1960c0a68be4Smrg				  __builtin_copysignl(0.0l, __z.imag()));
1961c0a68be4Smrg    return __z;
1962c0a68be4Smrg  }
1963c0a68be4Smrg#endif
1964c0a68be4Smrg
19651debfc3dSmrg  template<typename _Tp>
19661debfc3dSmrg    inline std::complex<_Tp>
19671debfc3dSmrg    proj(const std::complex<_Tp>& __z)
19681debfc3dSmrg    { return __complex_proj(__z); }
19691debfc3dSmrg
1970c0a68be4Smrg  // Overload for scalars
19711debfc3dSmrg  template<typename _Tp>
19721debfc3dSmrg    inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
19731debfc3dSmrg    proj(_Tp __x)
19741debfc3dSmrg    {
19751debfc3dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
19761debfc3dSmrg      return std::proj(std::complex<__type>(__x));
19771debfc3dSmrg    }
19781debfc3dSmrg
19791debfc3dSmrg  template<typename _Tp>
1980c0a68be4Smrg    inline _GLIBCXX20_CONSTEXPR
1981c0a68be4Smrg	std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
19821debfc3dSmrg    conj(_Tp __x)
19831debfc3dSmrg    {
19841debfc3dSmrg      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
19851debfc3dSmrg      return std::complex<__type>(__x, -__type());
19861debfc3dSmrg    }
19871debfc3dSmrg
19881debfc3dSmrg#if __cplusplus > 201103L
19891debfc3dSmrg
19901debfc3dSmrginline namespace literals {
19911debfc3dSmrginline namespace complex_literals {
1992a2dc1f3fSmrg#pragma GCC diagnostic push
1993a2dc1f3fSmrg#pragma GCC diagnostic ignored "-Wliteral-suffix"
19941debfc3dSmrg#define __cpp_lib_complex_udls 201309
19951debfc3dSmrg
19961debfc3dSmrg  constexpr std::complex<float>
19971debfc3dSmrg  operator""if(long double __num)
19981debfc3dSmrg  { return std::complex<float>{0.0F, static_cast<float>(__num)}; }
19991debfc3dSmrg
20001debfc3dSmrg  constexpr std::complex<float>
20011debfc3dSmrg  operator""if(unsigned long long __num)
20021debfc3dSmrg  { return std::complex<float>{0.0F, static_cast<float>(__num)}; }
20031debfc3dSmrg
20041debfc3dSmrg  constexpr std::complex<double>
20051debfc3dSmrg  operator""i(long double __num)
20061debfc3dSmrg  { return std::complex<double>{0.0, static_cast<double>(__num)}; }
20071debfc3dSmrg
20081debfc3dSmrg  constexpr std::complex<double>
20091debfc3dSmrg  operator""i(unsigned long long __num)
20101debfc3dSmrg  { return std::complex<double>{0.0, static_cast<double>(__num)}; }
20111debfc3dSmrg
20121debfc3dSmrg  constexpr std::complex<long double>
20131debfc3dSmrg  operator""il(long double __num)
20141debfc3dSmrg  { return std::complex<long double>{0.0L, __num}; }
20151debfc3dSmrg
20161debfc3dSmrg  constexpr std::complex<long double>
20171debfc3dSmrg  operator""il(unsigned long long __num)
20181debfc3dSmrg  { return std::complex<long double>{0.0L, static_cast<long double>(__num)}; }
20191debfc3dSmrg
2020a2dc1f3fSmrg#pragma GCC diagnostic pop
20211debfc3dSmrg} // inline namespace complex_literals
20221debfc3dSmrg} // inline namespace literals
20231debfc3dSmrg
20241debfc3dSmrg#endif // C++14
20251debfc3dSmrg
2026a2dc1f3fSmrg_GLIBCXX_END_NAMESPACE_VERSION
20271debfc3dSmrg} // namespace
20281debfc3dSmrg
20291debfc3dSmrg#endif  // C++11
20301debfc3dSmrg
20311debfc3dSmrg#endif  /* _GLIBCXX_COMPLEX */
2032