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