1*38fd1498Szrj// The template and inlines for the -*- C++ -*- complex number classes. 2*38fd1498Szrj 3*38fd1498Szrj// Copyright (C) 1997-2018 Free Software Foundation, Inc. 4*38fd1498Szrj// 5*38fd1498Szrj// This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj// software; you can redistribute it and/or modify it under the 7*38fd1498Szrj// terms of the GNU General Public License as published by the 8*38fd1498Szrj// Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj// any later version. 10*38fd1498Szrj 11*38fd1498Szrj// This library is distributed in the hope that it will be useful, 12*38fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj// GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj// permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj// 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj// You should have received a copy of the GNU General Public License and 21*38fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj// <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj/** @file include/complex 26*38fd1498Szrj * This is a Standard C++ Library header. 27*38fd1498Szrj */ 28*38fd1498Szrj 29*38fd1498Szrj// 30*38fd1498Szrj// ISO C++ 14882: 26.2 Complex Numbers 31*38fd1498Szrj// Note: this is not a conforming implementation. 32*38fd1498Szrj// Initially implemented by Ulrich Drepper <drepper@cygnus.com> 33*38fd1498Szrj// Improved by Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> 34*38fd1498Szrj// 35*38fd1498Szrj 36*38fd1498Szrj#ifndef _GLIBCXX_COMPLEX 37*38fd1498Szrj#define _GLIBCXX_COMPLEX 1 38*38fd1498Szrj 39*38fd1498Szrj#pragma GCC system_header 40*38fd1498Szrj 41*38fd1498Szrj#include <bits/c++config.h> 42*38fd1498Szrj#include <bits/cpp_type_traits.h> 43*38fd1498Szrj#include <ext/type_traits.h> 44*38fd1498Szrj#include <cmath> 45*38fd1498Szrj#include <sstream> 46*38fd1498Szrj 47*38fd1498Szrj// Get rid of a macro possibly defined in <complex.h> 48*38fd1498Szrj#undef complex 49*38fd1498Szrj 50*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default) 51*38fd1498Szrj{ 52*38fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION 53*38fd1498Szrj 54*38fd1498Szrj /** 55*38fd1498Szrj * @defgroup complex_numbers Complex Numbers 56*38fd1498Szrj * @ingroup numerics 57*38fd1498Szrj * 58*38fd1498Szrj * Classes and functions for complex numbers. 59*38fd1498Szrj * @{ 60*38fd1498Szrj */ 61*38fd1498Szrj 62*38fd1498Szrj // Forward declarations. 63*38fd1498Szrj template<typename _Tp> class complex; 64*38fd1498Szrj template<> class complex<float>; 65*38fd1498Szrj template<> class complex<double>; 66*38fd1498Szrj template<> class complex<long double>; 67*38fd1498Szrj 68*38fd1498Szrj /// Return magnitude of @a z. 69*38fd1498Szrj template<typename _Tp> _Tp abs(const complex<_Tp>&); 70*38fd1498Szrj /// Return phase angle of @a z. 71*38fd1498Szrj template<typename _Tp> _Tp arg(const complex<_Tp>&); 72*38fd1498Szrj /// Return @a z magnitude squared. 73*38fd1498Szrj template<typename _Tp> _Tp norm(const complex<_Tp>&); 74*38fd1498Szrj 75*38fd1498Szrj /// Return complex conjugate of @a z. 76*38fd1498Szrj template<typename _Tp> complex<_Tp> conj(const complex<_Tp>&); 77*38fd1498Szrj /// Return complex with magnitude @a rho and angle @a theta. 78*38fd1498Szrj template<typename _Tp> complex<_Tp> polar(const _Tp&, const _Tp& = 0); 79*38fd1498Szrj 80*38fd1498Szrj // Transcendentals: 81*38fd1498Szrj /// Return complex cosine of @a z. 82*38fd1498Szrj template<typename _Tp> complex<_Tp> cos(const complex<_Tp>&); 83*38fd1498Szrj /// Return complex hyperbolic cosine of @a z. 84*38fd1498Szrj template<typename _Tp> complex<_Tp> cosh(const complex<_Tp>&); 85*38fd1498Szrj /// Return complex base e exponential of @a z. 86*38fd1498Szrj template<typename _Tp> complex<_Tp> exp(const complex<_Tp>&); 87*38fd1498Szrj /// Return complex natural logarithm of @a z. 88*38fd1498Szrj template<typename _Tp> complex<_Tp> log(const complex<_Tp>&); 89*38fd1498Szrj /// Return complex base 10 logarithm of @a z. 90*38fd1498Szrj template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&); 91*38fd1498Szrj /// Return @a x to the @a y'th power. 92*38fd1498Szrj template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int); 93*38fd1498Szrj /// Return @a x to the @a y'th power. 94*38fd1498Szrj template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&); 95*38fd1498Szrj /// Return @a x to the @a y'th power. 96*38fd1498Szrj template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, 97*38fd1498Szrj const complex<_Tp>&); 98*38fd1498Szrj /// Return @a x to the @a y'th power. 99*38fd1498Szrj template<typename _Tp> complex<_Tp> pow(const _Tp&, const complex<_Tp>&); 100*38fd1498Szrj /// Return complex sine of @a z. 101*38fd1498Szrj template<typename _Tp> complex<_Tp> sin(const complex<_Tp>&); 102*38fd1498Szrj /// Return complex hyperbolic sine of @a z. 103*38fd1498Szrj template<typename _Tp> complex<_Tp> sinh(const complex<_Tp>&); 104*38fd1498Szrj /// Return complex square root of @a z. 105*38fd1498Szrj template<typename _Tp> complex<_Tp> sqrt(const complex<_Tp>&); 106*38fd1498Szrj /// Return complex tangent of @a z. 107*38fd1498Szrj template<typename _Tp> complex<_Tp> tan(const complex<_Tp>&); 108*38fd1498Szrj /// Return complex hyperbolic tangent of @a z. 109*38fd1498Szrj template<typename _Tp> complex<_Tp> tanh(const complex<_Tp>&); 110*38fd1498Szrj 111*38fd1498Szrj 112*38fd1498Szrj // 26.2.2 Primary template class complex 113*38fd1498Szrj /** 114*38fd1498Szrj * Template to represent complex numbers. 115*38fd1498Szrj * 116*38fd1498Szrj * Specializations for float, double, and long double are part of the 117*38fd1498Szrj * library. Results with any other type are not guaranteed. 118*38fd1498Szrj * 119*38fd1498Szrj * @param Tp Type of real and imaginary values. 120*38fd1498Szrj */ 121*38fd1498Szrj template<typename _Tp> 122*38fd1498Szrj struct complex 123*38fd1498Szrj { 124*38fd1498Szrj /// Value typedef. 125*38fd1498Szrj typedef _Tp value_type; 126*38fd1498Szrj 127*38fd1498Szrj /// Default constructor. First parameter is x, second parameter is y. 128*38fd1498Szrj /// Unspecified parameters default to 0. 129*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(const _Tp& __r = _Tp(), const _Tp& __i = _Tp()) 130*38fd1498Szrj : _M_real(__r), _M_imag(__i) { } 131*38fd1498Szrj 132*38fd1498Szrj // Let the compiler synthesize the copy constructor 133*38fd1498Szrj#if __cplusplus >= 201103L 134*38fd1498Szrj constexpr complex(const complex&) = default; 135*38fd1498Szrj#endif 136*38fd1498Szrj 137*38fd1498Szrj /// Converting constructor. 138*38fd1498Szrj template<typename _Up> 139*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(const complex<_Up>& __z) 140*38fd1498Szrj : _M_real(__z.real()), _M_imag(__z.imag()) { } 141*38fd1498Szrj 142*38fd1498Szrj#if __cplusplus >= 201103L 143*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 144*38fd1498Szrj // DR 387. std::complex over-encapsulated. 145*38fd1498Szrj _GLIBCXX_ABI_TAG_CXX11 146*38fd1498Szrj constexpr _Tp 147*38fd1498Szrj real() const { return _M_real; } 148*38fd1498Szrj 149*38fd1498Szrj _GLIBCXX_ABI_TAG_CXX11 150*38fd1498Szrj constexpr _Tp 151*38fd1498Szrj imag() const { return _M_imag; } 152*38fd1498Szrj#else 153*38fd1498Szrj /// Return real part of complex number. 154*38fd1498Szrj _Tp& 155*38fd1498Szrj real() { return _M_real; } 156*38fd1498Szrj 157*38fd1498Szrj /// Return real part of complex number. 158*38fd1498Szrj const _Tp& 159*38fd1498Szrj real() const { return _M_real; } 160*38fd1498Szrj 161*38fd1498Szrj /// Return imaginary part of complex number. 162*38fd1498Szrj _Tp& 163*38fd1498Szrj imag() { return _M_imag; } 164*38fd1498Szrj 165*38fd1498Szrj /// Return imaginary part of complex number. 166*38fd1498Szrj const _Tp& 167*38fd1498Szrj imag() const { return _M_imag; } 168*38fd1498Szrj#endif 169*38fd1498Szrj 170*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 171*38fd1498Szrj // DR 387. std::complex over-encapsulated. 172*38fd1498Szrj void 173*38fd1498Szrj real(_Tp __val) { _M_real = __val; } 174*38fd1498Szrj 175*38fd1498Szrj void 176*38fd1498Szrj imag(_Tp __val) { _M_imag = __val; } 177*38fd1498Szrj 178*38fd1498Szrj /// Assign a scalar to this complex number. 179*38fd1498Szrj complex<_Tp>& operator=(const _Tp&); 180*38fd1498Szrj 181*38fd1498Szrj /// Add a scalar to this complex number. 182*38fd1498Szrj // 26.2.5/1 183*38fd1498Szrj complex<_Tp>& 184*38fd1498Szrj operator+=(const _Tp& __t) 185*38fd1498Szrj { 186*38fd1498Szrj _M_real += __t; 187*38fd1498Szrj return *this; 188*38fd1498Szrj } 189*38fd1498Szrj 190*38fd1498Szrj /// Subtract a scalar from this complex number. 191*38fd1498Szrj // 26.2.5/3 192*38fd1498Szrj complex<_Tp>& 193*38fd1498Szrj operator-=(const _Tp& __t) 194*38fd1498Szrj { 195*38fd1498Szrj _M_real -= __t; 196*38fd1498Szrj return *this; 197*38fd1498Szrj } 198*38fd1498Szrj 199*38fd1498Szrj /// Multiply this complex number by a scalar. 200*38fd1498Szrj complex<_Tp>& operator*=(const _Tp&); 201*38fd1498Szrj /// Divide this complex number by a scalar. 202*38fd1498Szrj complex<_Tp>& operator/=(const _Tp&); 203*38fd1498Szrj 204*38fd1498Szrj // Let the compiler synthesize the copy assignment operator 205*38fd1498Szrj#if __cplusplus >= 201103L 206*38fd1498Szrj complex& operator=(const complex&) = default; 207*38fd1498Szrj#endif 208*38fd1498Szrj 209*38fd1498Szrj /// Assign another complex number to this one. 210*38fd1498Szrj template<typename _Up> 211*38fd1498Szrj complex<_Tp>& operator=(const complex<_Up>&); 212*38fd1498Szrj /// Add another complex number to this one. 213*38fd1498Szrj template<typename _Up> 214*38fd1498Szrj complex<_Tp>& operator+=(const complex<_Up>&); 215*38fd1498Szrj /// Subtract another complex number from this one. 216*38fd1498Szrj template<typename _Up> 217*38fd1498Szrj complex<_Tp>& operator-=(const complex<_Up>&); 218*38fd1498Szrj /// Multiply this complex number by another. 219*38fd1498Szrj template<typename _Up> 220*38fd1498Szrj complex<_Tp>& operator*=(const complex<_Up>&); 221*38fd1498Szrj /// Divide this complex number by another. 222*38fd1498Szrj template<typename _Up> 223*38fd1498Szrj complex<_Tp>& operator/=(const complex<_Up>&); 224*38fd1498Szrj 225*38fd1498Szrj _GLIBCXX_CONSTEXPR complex __rep() const 226*38fd1498Szrj { return *this; } 227*38fd1498Szrj 228*38fd1498Szrj private: 229*38fd1498Szrj _Tp _M_real; 230*38fd1498Szrj _Tp _M_imag; 231*38fd1498Szrj }; 232*38fd1498Szrj 233*38fd1498Szrj template<typename _Tp> 234*38fd1498Szrj complex<_Tp>& 235*38fd1498Szrj complex<_Tp>::operator=(const _Tp& __t) 236*38fd1498Szrj { 237*38fd1498Szrj _M_real = __t; 238*38fd1498Szrj _M_imag = _Tp(); 239*38fd1498Szrj return *this; 240*38fd1498Szrj } 241*38fd1498Szrj 242*38fd1498Szrj // 26.2.5/5 243*38fd1498Szrj template<typename _Tp> 244*38fd1498Szrj complex<_Tp>& 245*38fd1498Szrj complex<_Tp>::operator*=(const _Tp& __t) 246*38fd1498Szrj { 247*38fd1498Szrj _M_real *= __t; 248*38fd1498Szrj _M_imag *= __t; 249*38fd1498Szrj return *this; 250*38fd1498Szrj } 251*38fd1498Szrj 252*38fd1498Szrj // 26.2.5/7 253*38fd1498Szrj template<typename _Tp> 254*38fd1498Szrj complex<_Tp>& 255*38fd1498Szrj complex<_Tp>::operator/=(const _Tp& __t) 256*38fd1498Szrj { 257*38fd1498Szrj _M_real /= __t; 258*38fd1498Szrj _M_imag /= __t; 259*38fd1498Szrj return *this; 260*38fd1498Szrj } 261*38fd1498Szrj 262*38fd1498Szrj template<typename _Tp> 263*38fd1498Szrj template<typename _Up> 264*38fd1498Szrj complex<_Tp>& 265*38fd1498Szrj complex<_Tp>::operator=(const complex<_Up>& __z) 266*38fd1498Szrj { 267*38fd1498Szrj _M_real = __z.real(); 268*38fd1498Szrj _M_imag = __z.imag(); 269*38fd1498Szrj return *this; 270*38fd1498Szrj } 271*38fd1498Szrj 272*38fd1498Szrj // 26.2.5/9 273*38fd1498Szrj template<typename _Tp> 274*38fd1498Szrj template<typename _Up> 275*38fd1498Szrj complex<_Tp>& 276*38fd1498Szrj complex<_Tp>::operator+=(const complex<_Up>& __z) 277*38fd1498Szrj { 278*38fd1498Szrj _M_real += __z.real(); 279*38fd1498Szrj _M_imag += __z.imag(); 280*38fd1498Szrj return *this; 281*38fd1498Szrj } 282*38fd1498Szrj 283*38fd1498Szrj // 26.2.5/11 284*38fd1498Szrj template<typename _Tp> 285*38fd1498Szrj template<typename _Up> 286*38fd1498Szrj complex<_Tp>& 287*38fd1498Szrj complex<_Tp>::operator-=(const complex<_Up>& __z) 288*38fd1498Szrj { 289*38fd1498Szrj _M_real -= __z.real(); 290*38fd1498Szrj _M_imag -= __z.imag(); 291*38fd1498Szrj return *this; 292*38fd1498Szrj } 293*38fd1498Szrj 294*38fd1498Szrj // 26.2.5/13 295*38fd1498Szrj // XXX: This is a grammar school implementation. 296*38fd1498Szrj template<typename _Tp> 297*38fd1498Szrj template<typename _Up> 298*38fd1498Szrj complex<_Tp>& 299*38fd1498Szrj complex<_Tp>::operator*=(const complex<_Up>& __z) 300*38fd1498Szrj { 301*38fd1498Szrj const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag(); 302*38fd1498Szrj _M_imag = _M_real * __z.imag() + _M_imag * __z.real(); 303*38fd1498Szrj _M_real = __r; 304*38fd1498Szrj return *this; 305*38fd1498Szrj } 306*38fd1498Szrj 307*38fd1498Szrj // 26.2.5/15 308*38fd1498Szrj // XXX: This is a grammar school implementation. 309*38fd1498Szrj template<typename _Tp> 310*38fd1498Szrj template<typename _Up> 311*38fd1498Szrj complex<_Tp>& 312*38fd1498Szrj complex<_Tp>::operator/=(const complex<_Up>& __z) 313*38fd1498Szrj { 314*38fd1498Szrj const _Tp __r = _M_real * __z.real() + _M_imag * __z.imag(); 315*38fd1498Szrj const _Tp __n = std::norm(__z); 316*38fd1498Szrj _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n; 317*38fd1498Szrj _M_real = __r / __n; 318*38fd1498Szrj return *this; 319*38fd1498Szrj } 320*38fd1498Szrj 321*38fd1498Szrj // Operators: 322*38fd1498Szrj //@{ 323*38fd1498Szrj /// Return new complex value @a x plus @a y. 324*38fd1498Szrj template<typename _Tp> 325*38fd1498Szrj inline complex<_Tp> 326*38fd1498Szrj operator+(const complex<_Tp>& __x, const complex<_Tp>& __y) 327*38fd1498Szrj { 328*38fd1498Szrj complex<_Tp> __r = __x; 329*38fd1498Szrj __r += __y; 330*38fd1498Szrj return __r; 331*38fd1498Szrj } 332*38fd1498Szrj 333*38fd1498Szrj template<typename _Tp> 334*38fd1498Szrj inline complex<_Tp> 335*38fd1498Szrj operator+(const complex<_Tp>& __x, const _Tp& __y) 336*38fd1498Szrj { 337*38fd1498Szrj complex<_Tp> __r = __x; 338*38fd1498Szrj __r += __y; 339*38fd1498Szrj return __r; 340*38fd1498Szrj } 341*38fd1498Szrj 342*38fd1498Szrj template<typename _Tp> 343*38fd1498Szrj inline complex<_Tp> 344*38fd1498Szrj operator+(const _Tp& __x, const complex<_Tp>& __y) 345*38fd1498Szrj { 346*38fd1498Szrj complex<_Tp> __r = __y; 347*38fd1498Szrj __r += __x; 348*38fd1498Szrj return __r; 349*38fd1498Szrj } 350*38fd1498Szrj //@} 351*38fd1498Szrj 352*38fd1498Szrj //@{ 353*38fd1498Szrj /// Return new complex value @a x minus @a y. 354*38fd1498Szrj template<typename _Tp> 355*38fd1498Szrj inline complex<_Tp> 356*38fd1498Szrj operator-(const complex<_Tp>& __x, const complex<_Tp>& __y) 357*38fd1498Szrj { 358*38fd1498Szrj complex<_Tp> __r = __x; 359*38fd1498Szrj __r -= __y; 360*38fd1498Szrj return __r; 361*38fd1498Szrj } 362*38fd1498Szrj 363*38fd1498Szrj template<typename _Tp> 364*38fd1498Szrj inline complex<_Tp> 365*38fd1498Szrj operator-(const complex<_Tp>& __x, const _Tp& __y) 366*38fd1498Szrj { 367*38fd1498Szrj complex<_Tp> __r = __x; 368*38fd1498Szrj __r -= __y; 369*38fd1498Szrj return __r; 370*38fd1498Szrj } 371*38fd1498Szrj 372*38fd1498Szrj template<typename _Tp> 373*38fd1498Szrj inline complex<_Tp> 374*38fd1498Szrj operator-(const _Tp& __x, const complex<_Tp>& __y) 375*38fd1498Szrj { 376*38fd1498Szrj complex<_Tp> __r(__x, -__y.imag()); 377*38fd1498Szrj __r -= __y.real(); 378*38fd1498Szrj return __r; 379*38fd1498Szrj } 380*38fd1498Szrj //@} 381*38fd1498Szrj 382*38fd1498Szrj //@{ 383*38fd1498Szrj /// Return new complex value @a x times @a y. 384*38fd1498Szrj template<typename _Tp> 385*38fd1498Szrj inline complex<_Tp> 386*38fd1498Szrj operator*(const complex<_Tp>& __x, const complex<_Tp>& __y) 387*38fd1498Szrj { 388*38fd1498Szrj complex<_Tp> __r = __x; 389*38fd1498Szrj __r *= __y; 390*38fd1498Szrj return __r; 391*38fd1498Szrj } 392*38fd1498Szrj 393*38fd1498Szrj template<typename _Tp> 394*38fd1498Szrj inline complex<_Tp> 395*38fd1498Szrj operator*(const complex<_Tp>& __x, const _Tp& __y) 396*38fd1498Szrj { 397*38fd1498Szrj complex<_Tp> __r = __x; 398*38fd1498Szrj __r *= __y; 399*38fd1498Szrj return __r; 400*38fd1498Szrj } 401*38fd1498Szrj 402*38fd1498Szrj template<typename _Tp> 403*38fd1498Szrj inline complex<_Tp> 404*38fd1498Szrj operator*(const _Tp& __x, const complex<_Tp>& __y) 405*38fd1498Szrj { 406*38fd1498Szrj complex<_Tp> __r = __y; 407*38fd1498Szrj __r *= __x; 408*38fd1498Szrj return __r; 409*38fd1498Szrj } 410*38fd1498Szrj //@} 411*38fd1498Szrj 412*38fd1498Szrj //@{ 413*38fd1498Szrj /// Return new complex value @a x divided by @a y. 414*38fd1498Szrj template<typename _Tp> 415*38fd1498Szrj inline complex<_Tp> 416*38fd1498Szrj operator/(const complex<_Tp>& __x, const complex<_Tp>& __y) 417*38fd1498Szrj { 418*38fd1498Szrj complex<_Tp> __r = __x; 419*38fd1498Szrj __r /= __y; 420*38fd1498Szrj return __r; 421*38fd1498Szrj } 422*38fd1498Szrj 423*38fd1498Szrj template<typename _Tp> 424*38fd1498Szrj inline complex<_Tp> 425*38fd1498Szrj operator/(const complex<_Tp>& __x, const _Tp& __y) 426*38fd1498Szrj { 427*38fd1498Szrj complex<_Tp> __r = __x; 428*38fd1498Szrj __r /= __y; 429*38fd1498Szrj return __r; 430*38fd1498Szrj } 431*38fd1498Szrj 432*38fd1498Szrj template<typename _Tp> 433*38fd1498Szrj inline complex<_Tp> 434*38fd1498Szrj operator/(const _Tp& __x, const complex<_Tp>& __y) 435*38fd1498Szrj { 436*38fd1498Szrj complex<_Tp> __r = __x; 437*38fd1498Szrj __r /= __y; 438*38fd1498Szrj return __r; 439*38fd1498Szrj } 440*38fd1498Szrj //@} 441*38fd1498Szrj 442*38fd1498Szrj /// Return @a x. 443*38fd1498Szrj template<typename _Tp> 444*38fd1498Szrj inline complex<_Tp> 445*38fd1498Szrj operator+(const complex<_Tp>& __x) 446*38fd1498Szrj { return __x; } 447*38fd1498Szrj 448*38fd1498Szrj /// Return complex negation of @a x. 449*38fd1498Szrj template<typename _Tp> 450*38fd1498Szrj inline complex<_Tp> 451*38fd1498Szrj operator-(const complex<_Tp>& __x) 452*38fd1498Szrj { return complex<_Tp>(-__x.real(), -__x.imag()); } 453*38fd1498Szrj 454*38fd1498Szrj //@{ 455*38fd1498Szrj /// Return true if @a x is equal to @a y. 456*38fd1498Szrj template<typename _Tp> 457*38fd1498Szrj inline _GLIBCXX_CONSTEXPR bool 458*38fd1498Szrj operator==(const complex<_Tp>& __x, const complex<_Tp>& __y) 459*38fd1498Szrj { return __x.real() == __y.real() && __x.imag() == __y.imag(); } 460*38fd1498Szrj 461*38fd1498Szrj template<typename _Tp> 462*38fd1498Szrj inline _GLIBCXX_CONSTEXPR bool 463*38fd1498Szrj operator==(const complex<_Tp>& __x, const _Tp& __y) 464*38fd1498Szrj { return __x.real() == __y && __x.imag() == _Tp(); } 465*38fd1498Szrj 466*38fd1498Szrj template<typename _Tp> 467*38fd1498Szrj inline _GLIBCXX_CONSTEXPR bool 468*38fd1498Szrj operator==(const _Tp& __x, const complex<_Tp>& __y) 469*38fd1498Szrj { return __x == __y.real() && _Tp() == __y.imag(); } 470*38fd1498Szrj //@} 471*38fd1498Szrj 472*38fd1498Szrj //@{ 473*38fd1498Szrj /// Return false if @a x is equal to @a y. 474*38fd1498Szrj template<typename _Tp> 475*38fd1498Szrj inline _GLIBCXX_CONSTEXPR bool 476*38fd1498Szrj operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) 477*38fd1498Szrj { return __x.real() != __y.real() || __x.imag() != __y.imag(); } 478*38fd1498Szrj 479*38fd1498Szrj template<typename _Tp> 480*38fd1498Szrj inline _GLIBCXX_CONSTEXPR bool 481*38fd1498Szrj operator!=(const complex<_Tp>& __x, const _Tp& __y) 482*38fd1498Szrj { return __x.real() != __y || __x.imag() != _Tp(); } 483*38fd1498Szrj 484*38fd1498Szrj template<typename _Tp> 485*38fd1498Szrj inline _GLIBCXX_CONSTEXPR bool 486*38fd1498Szrj operator!=(const _Tp& __x, const complex<_Tp>& __y) 487*38fd1498Szrj { return __x != __y.real() || _Tp() != __y.imag(); } 488*38fd1498Szrj //@} 489*38fd1498Szrj 490*38fd1498Szrj /// Extraction operator for complex values. 491*38fd1498Szrj template<typename _Tp, typename _CharT, class _Traits> 492*38fd1498Szrj basic_istream<_CharT, _Traits>& 493*38fd1498Szrj operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) 494*38fd1498Szrj { 495*38fd1498Szrj bool __fail = true; 496*38fd1498Szrj _CharT __ch; 497*38fd1498Szrj if (__is >> __ch) 498*38fd1498Szrj { 499*38fd1498Szrj if (_Traits::eq(__ch, __is.widen('('))) 500*38fd1498Szrj { 501*38fd1498Szrj _Tp __u; 502*38fd1498Szrj if (__is >> __u >> __ch) 503*38fd1498Szrj { 504*38fd1498Szrj const _CharT __rparen = __is.widen(')'); 505*38fd1498Szrj if (_Traits::eq(__ch, __rparen)) 506*38fd1498Szrj { 507*38fd1498Szrj __x = __u; 508*38fd1498Szrj __fail = false; 509*38fd1498Szrj } 510*38fd1498Szrj else if (_Traits::eq(__ch, __is.widen(','))) 511*38fd1498Szrj { 512*38fd1498Szrj _Tp __v; 513*38fd1498Szrj if (__is >> __v >> __ch) 514*38fd1498Szrj { 515*38fd1498Szrj if (_Traits::eq(__ch, __rparen)) 516*38fd1498Szrj { 517*38fd1498Szrj __x = complex<_Tp>(__u, __v); 518*38fd1498Szrj __fail = false; 519*38fd1498Szrj } 520*38fd1498Szrj else 521*38fd1498Szrj __is.putback(__ch); 522*38fd1498Szrj } 523*38fd1498Szrj } 524*38fd1498Szrj else 525*38fd1498Szrj __is.putback(__ch); 526*38fd1498Szrj } 527*38fd1498Szrj } 528*38fd1498Szrj else 529*38fd1498Szrj { 530*38fd1498Szrj __is.putback(__ch); 531*38fd1498Szrj _Tp __u; 532*38fd1498Szrj if (__is >> __u) 533*38fd1498Szrj { 534*38fd1498Szrj __x = __u; 535*38fd1498Szrj __fail = false; 536*38fd1498Szrj } 537*38fd1498Szrj } 538*38fd1498Szrj } 539*38fd1498Szrj if (__fail) 540*38fd1498Szrj __is.setstate(ios_base::failbit); 541*38fd1498Szrj return __is; 542*38fd1498Szrj } 543*38fd1498Szrj 544*38fd1498Szrj /// Insertion operator for complex values. 545*38fd1498Szrj template<typename _Tp, typename _CharT, class _Traits> 546*38fd1498Szrj basic_ostream<_CharT, _Traits>& 547*38fd1498Szrj operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 548*38fd1498Szrj { 549*38fd1498Szrj basic_ostringstream<_CharT, _Traits> __s; 550*38fd1498Szrj __s.flags(__os.flags()); 551*38fd1498Szrj __s.imbue(__os.getloc()); 552*38fd1498Szrj __s.precision(__os.precision()); 553*38fd1498Szrj __s << '(' << __x.real() << ',' << __x.imag() << ')'; 554*38fd1498Szrj return __os << __s.str(); 555*38fd1498Szrj } 556*38fd1498Szrj 557*38fd1498Szrj // Values 558*38fd1498Szrj#if __cplusplus >= 201103L 559*38fd1498Szrj template<typename _Tp> 560*38fd1498Szrj constexpr _Tp 561*38fd1498Szrj real(const complex<_Tp>& __z) 562*38fd1498Szrj { return __z.real(); } 563*38fd1498Szrj 564*38fd1498Szrj template<typename _Tp> 565*38fd1498Szrj constexpr _Tp 566*38fd1498Szrj imag(const complex<_Tp>& __z) 567*38fd1498Szrj { return __z.imag(); } 568*38fd1498Szrj#else 569*38fd1498Szrj template<typename _Tp> 570*38fd1498Szrj inline _Tp& 571*38fd1498Szrj real(complex<_Tp>& __z) 572*38fd1498Szrj { return __z.real(); } 573*38fd1498Szrj 574*38fd1498Szrj template<typename _Tp> 575*38fd1498Szrj inline const _Tp& 576*38fd1498Szrj real(const complex<_Tp>& __z) 577*38fd1498Szrj { return __z.real(); } 578*38fd1498Szrj 579*38fd1498Szrj template<typename _Tp> 580*38fd1498Szrj inline _Tp& 581*38fd1498Szrj imag(complex<_Tp>& __z) 582*38fd1498Szrj { return __z.imag(); } 583*38fd1498Szrj 584*38fd1498Szrj template<typename _Tp> 585*38fd1498Szrj inline const _Tp& 586*38fd1498Szrj imag(const complex<_Tp>& __z) 587*38fd1498Szrj { return __z.imag(); } 588*38fd1498Szrj#endif 589*38fd1498Szrj 590*38fd1498Szrj // 26.2.7/3 abs(__z): Returns the magnitude of __z. 591*38fd1498Szrj template<typename _Tp> 592*38fd1498Szrj inline _Tp 593*38fd1498Szrj __complex_abs(const complex<_Tp>& __z) 594*38fd1498Szrj { 595*38fd1498Szrj _Tp __x = __z.real(); 596*38fd1498Szrj _Tp __y = __z.imag(); 597*38fd1498Szrj const _Tp __s = std::max(abs(__x), abs(__y)); 598*38fd1498Szrj if (__s == _Tp()) // well ... 599*38fd1498Szrj return __s; 600*38fd1498Szrj __x /= __s; 601*38fd1498Szrj __y /= __s; 602*38fd1498Szrj return __s * sqrt(__x * __x + __y * __y); 603*38fd1498Szrj } 604*38fd1498Szrj 605*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 606*38fd1498Szrj inline float 607*38fd1498Szrj __complex_abs(__complex__ float __z) { return __builtin_cabsf(__z); } 608*38fd1498Szrj 609*38fd1498Szrj inline double 610*38fd1498Szrj __complex_abs(__complex__ double __z) { return __builtin_cabs(__z); } 611*38fd1498Szrj 612*38fd1498Szrj inline long double 613*38fd1498Szrj __complex_abs(const __complex__ long double& __z) 614*38fd1498Szrj { return __builtin_cabsl(__z); } 615*38fd1498Szrj 616*38fd1498Szrj template<typename _Tp> 617*38fd1498Szrj inline _Tp 618*38fd1498Szrj abs(const complex<_Tp>& __z) { return __complex_abs(__z.__rep()); } 619*38fd1498Szrj#else 620*38fd1498Szrj template<typename _Tp> 621*38fd1498Szrj inline _Tp 622*38fd1498Szrj abs(const complex<_Tp>& __z) { return __complex_abs(__z); } 623*38fd1498Szrj#endif 624*38fd1498Szrj 625*38fd1498Szrj 626*38fd1498Szrj // 26.2.7/4: arg(__z): Returns the phase angle of __z. 627*38fd1498Szrj template<typename _Tp> 628*38fd1498Szrj inline _Tp 629*38fd1498Szrj __complex_arg(const complex<_Tp>& __z) 630*38fd1498Szrj { return atan2(__z.imag(), __z.real()); } 631*38fd1498Szrj 632*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 633*38fd1498Szrj inline float 634*38fd1498Szrj __complex_arg(__complex__ float __z) { return __builtin_cargf(__z); } 635*38fd1498Szrj 636*38fd1498Szrj inline double 637*38fd1498Szrj __complex_arg(__complex__ double __z) { return __builtin_carg(__z); } 638*38fd1498Szrj 639*38fd1498Szrj inline long double 640*38fd1498Szrj __complex_arg(const __complex__ long double& __z) 641*38fd1498Szrj { return __builtin_cargl(__z); } 642*38fd1498Szrj 643*38fd1498Szrj template<typename _Tp> 644*38fd1498Szrj inline _Tp 645*38fd1498Szrj arg(const complex<_Tp>& __z) { return __complex_arg(__z.__rep()); } 646*38fd1498Szrj#else 647*38fd1498Szrj template<typename _Tp> 648*38fd1498Szrj inline _Tp 649*38fd1498Szrj arg(const complex<_Tp>& __z) { return __complex_arg(__z); } 650*38fd1498Szrj#endif 651*38fd1498Szrj 652*38fd1498Szrj // 26.2.7/5: norm(__z) returns the squared magnitude of __z. 653*38fd1498Szrj // As defined, norm() is -not- a norm is the common mathematical 654*38fd1498Szrj // sense used in numerics. The helper class _Norm_helper<> tries to 655*38fd1498Szrj // distinguish between builtin floating point and the rest, so as 656*38fd1498Szrj // to deliver an answer as close as possible to the real value. 657*38fd1498Szrj template<bool> 658*38fd1498Szrj struct _Norm_helper 659*38fd1498Szrj { 660*38fd1498Szrj template<typename _Tp> 661*38fd1498Szrj static inline _Tp _S_do_it(const complex<_Tp>& __z) 662*38fd1498Szrj { 663*38fd1498Szrj const _Tp __x = __z.real(); 664*38fd1498Szrj const _Tp __y = __z.imag(); 665*38fd1498Szrj return __x * __x + __y * __y; 666*38fd1498Szrj } 667*38fd1498Szrj }; 668*38fd1498Szrj 669*38fd1498Szrj template<> 670*38fd1498Szrj struct _Norm_helper<true> 671*38fd1498Szrj { 672*38fd1498Szrj template<typename _Tp> 673*38fd1498Szrj static inline _Tp _S_do_it(const complex<_Tp>& __z) 674*38fd1498Szrj { 675*38fd1498Szrj _Tp __res = std::abs(__z); 676*38fd1498Szrj return __res * __res; 677*38fd1498Szrj } 678*38fd1498Szrj }; 679*38fd1498Szrj 680*38fd1498Szrj template<typename _Tp> 681*38fd1498Szrj inline _Tp 682*38fd1498Szrj norm(const complex<_Tp>& __z) 683*38fd1498Szrj { 684*38fd1498Szrj return _Norm_helper<__is_floating<_Tp>::__value 685*38fd1498Szrj && !_GLIBCXX_FAST_MATH>::_S_do_it(__z); 686*38fd1498Szrj } 687*38fd1498Szrj 688*38fd1498Szrj template<typename _Tp> 689*38fd1498Szrj inline complex<_Tp> 690*38fd1498Szrj polar(const _Tp& __rho, const _Tp& __theta) 691*38fd1498Szrj { 692*38fd1498Szrj __glibcxx_assert( __rho >= 0 ); 693*38fd1498Szrj return complex<_Tp>(__rho * cos(__theta), __rho * sin(__theta)); 694*38fd1498Szrj } 695*38fd1498Szrj 696*38fd1498Szrj template<typename _Tp> 697*38fd1498Szrj inline complex<_Tp> 698*38fd1498Szrj conj(const complex<_Tp>& __z) 699*38fd1498Szrj { return complex<_Tp>(__z.real(), -__z.imag()); } 700*38fd1498Szrj 701*38fd1498Szrj // Transcendentals 702*38fd1498Szrj 703*38fd1498Szrj // 26.2.8/1 cos(__z): Returns the cosine of __z. 704*38fd1498Szrj template<typename _Tp> 705*38fd1498Szrj inline complex<_Tp> 706*38fd1498Szrj __complex_cos(const complex<_Tp>& __z) 707*38fd1498Szrj { 708*38fd1498Szrj const _Tp __x = __z.real(); 709*38fd1498Szrj const _Tp __y = __z.imag(); 710*38fd1498Szrj return complex<_Tp>(cos(__x) * cosh(__y), -sin(__x) * sinh(__y)); 711*38fd1498Szrj } 712*38fd1498Szrj 713*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 714*38fd1498Szrj inline __complex__ float 715*38fd1498Szrj __complex_cos(__complex__ float __z) { return __builtin_ccosf(__z); } 716*38fd1498Szrj 717*38fd1498Szrj inline __complex__ double 718*38fd1498Szrj __complex_cos(__complex__ double __z) { return __builtin_ccos(__z); } 719*38fd1498Szrj 720*38fd1498Szrj inline __complex__ long double 721*38fd1498Szrj __complex_cos(const __complex__ long double& __z) 722*38fd1498Szrj { return __builtin_ccosl(__z); } 723*38fd1498Szrj 724*38fd1498Szrj template<typename _Tp> 725*38fd1498Szrj inline complex<_Tp> 726*38fd1498Szrj cos(const complex<_Tp>& __z) { return __complex_cos(__z.__rep()); } 727*38fd1498Szrj#else 728*38fd1498Szrj template<typename _Tp> 729*38fd1498Szrj inline complex<_Tp> 730*38fd1498Szrj cos(const complex<_Tp>& __z) { return __complex_cos(__z); } 731*38fd1498Szrj#endif 732*38fd1498Szrj 733*38fd1498Szrj // 26.2.8/2 cosh(__z): Returns the hyperbolic cosine of __z. 734*38fd1498Szrj template<typename _Tp> 735*38fd1498Szrj inline complex<_Tp> 736*38fd1498Szrj __complex_cosh(const complex<_Tp>& __z) 737*38fd1498Szrj { 738*38fd1498Szrj const _Tp __x = __z.real(); 739*38fd1498Szrj const _Tp __y = __z.imag(); 740*38fd1498Szrj return complex<_Tp>(cosh(__x) * cos(__y), sinh(__x) * sin(__y)); 741*38fd1498Szrj } 742*38fd1498Szrj 743*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 744*38fd1498Szrj inline __complex__ float 745*38fd1498Szrj __complex_cosh(__complex__ float __z) { return __builtin_ccoshf(__z); } 746*38fd1498Szrj 747*38fd1498Szrj inline __complex__ double 748*38fd1498Szrj __complex_cosh(__complex__ double __z) { return __builtin_ccosh(__z); } 749*38fd1498Szrj 750*38fd1498Szrj inline __complex__ long double 751*38fd1498Szrj __complex_cosh(const __complex__ long double& __z) 752*38fd1498Szrj { return __builtin_ccoshl(__z); } 753*38fd1498Szrj 754*38fd1498Szrj template<typename _Tp> 755*38fd1498Szrj inline complex<_Tp> 756*38fd1498Szrj cosh(const complex<_Tp>& __z) { return __complex_cosh(__z.__rep()); } 757*38fd1498Szrj#else 758*38fd1498Szrj template<typename _Tp> 759*38fd1498Szrj inline complex<_Tp> 760*38fd1498Szrj cosh(const complex<_Tp>& __z) { return __complex_cosh(__z); } 761*38fd1498Szrj#endif 762*38fd1498Szrj 763*38fd1498Szrj // 26.2.8/3 exp(__z): Returns the complex base e exponential of x 764*38fd1498Szrj template<typename _Tp> 765*38fd1498Szrj inline complex<_Tp> 766*38fd1498Szrj __complex_exp(const complex<_Tp>& __z) 767*38fd1498Szrj { return std::polar<_Tp>(exp(__z.real()), __z.imag()); } 768*38fd1498Szrj 769*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 770*38fd1498Szrj inline __complex__ float 771*38fd1498Szrj __complex_exp(__complex__ float __z) { return __builtin_cexpf(__z); } 772*38fd1498Szrj 773*38fd1498Szrj inline __complex__ double 774*38fd1498Szrj __complex_exp(__complex__ double __z) { return __builtin_cexp(__z); } 775*38fd1498Szrj 776*38fd1498Szrj inline __complex__ long double 777*38fd1498Szrj __complex_exp(const __complex__ long double& __z) 778*38fd1498Szrj { return __builtin_cexpl(__z); } 779*38fd1498Szrj 780*38fd1498Szrj template<typename _Tp> 781*38fd1498Szrj inline complex<_Tp> 782*38fd1498Szrj exp(const complex<_Tp>& __z) { return __complex_exp(__z.__rep()); } 783*38fd1498Szrj#else 784*38fd1498Szrj template<typename _Tp> 785*38fd1498Szrj inline complex<_Tp> 786*38fd1498Szrj exp(const complex<_Tp>& __z) { return __complex_exp(__z); } 787*38fd1498Szrj#endif 788*38fd1498Szrj 789*38fd1498Szrj // 26.2.8/5 log(__z): Returns the natural complex logarithm of __z. 790*38fd1498Szrj // The branch cut is along the negative axis. 791*38fd1498Szrj template<typename _Tp> 792*38fd1498Szrj inline complex<_Tp> 793*38fd1498Szrj __complex_log(const complex<_Tp>& __z) 794*38fd1498Szrj { return complex<_Tp>(log(std::abs(__z)), std::arg(__z)); } 795*38fd1498Szrj 796*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 797*38fd1498Szrj inline __complex__ float 798*38fd1498Szrj __complex_log(__complex__ float __z) { return __builtin_clogf(__z); } 799*38fd1498Szrj 800*38fd1498Szrj inline __complex__ double 801*38fd1498Szrj __complex_log(__complex__ double __z) { return __builtin_clog(__z); } 802*38fd1498Szrj 803*38fd1498Szrj inline __complex__ long double 804*38fd1498Szrj __complex_log(const __complex__ long double& __z) 805*38fd1498Szrj { return __builtin_clogl(__z); } 806*38fd1498Szrj 807*38fd1498Szrj template<typename _Tp> 808*38fd1498Szrj inline complex<_Tp> 809*38fd1498Szrj log(const complex<_Tp>& __z) { return __complex_log(__z.__rep()); } 810*38fd1498Szrj#else 811*38fd1498Szrj template<typename _Tp> 812*38fd1498Szrj inline complex<_Tp> 813*38fd1498Szrj log(const complex<_Tp>& __z) { return __complex_log(__z); } 814*38fd1498Szrj#endif 815*38fd1498Szrj 816*38fd1498Szrj template<typename _Tp> 817*38fd1498Szrj inline complex<_Tp> 818*38fd1498Szrj log10(const complex<_Tp>& __z) 819*38fd1498Szrj { return std::log(__z) / log(_Tp(10.0)); } 820*38fd1498Szrj 821*38fd1498Szrj // 26.2.8/10 sin(__z): Returns the sine of __z. 822*38fd1498Szrj template<typename _Tp> 823*38fd1498Szrj inline complex<_Tp> 824*38fd1498Szrj __complex_sin(const complex<_Tp>& __z) 825*38fd1498Szrj { 826*38fd1498Szrj const _Tp __x = __z.real(); 827*38fd1498Szrj const _Tp __y = __z.imag(); 828*38fd1498Szrj return complex<_Tp>(sin(__x) * cosh(__y), cos(__x) * sinh(__y)); 829*38fd1498Szrj } 830*38fd1498Szrj 831*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 832*38fd1498Szrj inline __complex__ float 833*38fd1498Szrj __complex_sin(__complex__ float __z) { return __builtin_csinf(__z); } 834*38fd1498Szrj 835*38fd1498Szrj inline __complex__ double 836*38fd1498Szrj __complex_sin(__complex__ double __z) { return __builtin_csin(__z); } 837*38fd1498Szrj 838*38fd1498Szrj inline __complex__ long double 839*38fd1498Szrj __complex_sin(const __complex__ long double& __z) 840*38fd1498Szrj { return __builtin_csinl(__z); } 841*38fd1498Szrj 842*38fd1498Szrj template<typename _Tp> 843*38fd1498Szrj inline complex<_Tp> 844*38fd1498Szrj sin(const complex<_Tp>& __z) { return __complex_sin(__z.__rep()); } 845*38fd1498Szrj#else 846*38fd1498Szrj template<typename _Tp> 847*38fd1498Szrj inline complex<_Tp> 848*38fd1498Szrj sin(const complex<_Tp>& __z) { return __complex_sin(__z); } 849*38fd1498Szrj#endif 850*38fd1498Szrj 851*38fd1498Szrj // 26.2.8/11 sinh(__z): Returns the hyperbolic sine of __z. 852*38fd1498Szrj template<typename _Tp> 853*38fd1498Szrj inline complex<_Tp> 854*38fd1498Szrj __complex_sinh(const complex<_Tp>& __z) 855*38fd1498Szrj { 856*38fd1498Szrj const _Tp __x = __z.real(); 857*38fd1498Szrj const _Tp __y = __z.imag(); 858*38fd1498Szrj return complex<_Tp>(sinh(__x) * cos(__y), cosh(__x) * sin(__y)); 859*38fd1498Szrj } 860*38fd1498Szrj 861*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 862*38fd1498Szrj inline __complex__ float 863*38fd1498Szrj __complex_sinh(__complex__ float __z) { return __builtin_csinhf(__z); } 864*38fd1498Szrj 865*38fd1498Szrj inline __complex__ double 866*38fd1498Szrj __complex_sinh(__complex__ double __z) { return __builtin_csinh(__z); } 867*38fd1498Szrj 868*38fd1498Szrj inline __complex__ long double 869*38fd1498Szrj __complex_sinh(const __complex__ long double& __z) 870*38fd1498Szrj { return __builtin_csinhl(__z); } 871*38fd1498Szrj 872*38fd1498Szrj template<typename _Tp> 873*38fd1498Szrj inline complex<_Tp> 874*38fd1498Szrj sinh(const complex<_Tp>& __z) { return __complex_sinh(__z.__rep()); } 875*38fd1498Szrj#else 876*38fd1498Szrj template<typename _Tp> 877*38fd1498Szrj inline complex<_Tp> 878*38fd1498Szrj sinh(const complex<_Tp>& __z) { return __complex_sinh(__z); } 879*38fd1498Szrj#endif 880*38fd1498Szrj 881*38fd1498Szrj // 26.2.8/13 sqrt(__z): Returns the complex square root of __z. 882*38fd1498Szrj // The branch cut is on the negative axis. 883*38fd1498Szrj template<typename _Tp> 884*38fd1498Szrj complex<_Tp> 885*38fd1498Szrj __complex_sqrt(const complex<_Tp>& __z) 886*38fd1498Szrj { 887*38fd1498Szrj _Tp __x = __z.real(); 888*38fd1498Szrj _Tp __y = __z.imag(); 889*38fd1498Szrj 890*38fd1498Szrj if (__x == _Tp()) 891*38fd1498Szrj { 892*38fd1498Szrj _Tp __t = sqrt(abs(__y) / 2); 893*38fd1498Szrj return complex<_Tp>(__t, __y < _Tp() ? -__t : __t); 894*38fd1498Szrj } 895*38fd1498Szrj else 896*38fd1498Szrj { 897*38fd1498Szrj _Tp __t = sqrt(2 * (std::abs(__z) + abs(__x))); 898*38fd1498Szrj _Tp __u = __t / 2; 899*38fd1498Szrj return __x > _Tp() 900*38fd1498Szrj ? complex<_Tp>(__u, __y / __t) 901*38fd1498Szrj : complex<_Tp>(abs(__y) / __t, __y < _Tp() ? -__u : __u); 902*38fd1498Szrj } 903*38fd1498Szrj } 904*38fd1498Szrj 905*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 906*38fd1498Szrj inline __complex__ float 907*38fd1498Szrj __complex_sqrt(__complex__ float __z) { return __builtin_csqrtf(__z); } 908*38fd1498Szrj 909*38fd1498Szrj inline __complex__ double 910*38fd1498Szrj __complex_sqrt(__complex__ double __z) { return __builtin_csqrt(__z); } 911*38fd1498Szrj 912*38fd1498Szrj inline __complex__ long double 913*38fd1498Szrj __complex_sqrt(const __complex__ long double& __z) 914*38fd1498Szrj { return __builtin_csqrtl(__z); } 915*38fd1498Szrj 916*38fd1498Szrj template<typename _Tp> 917*38fd1498Szrj inline complex<_Tp> 918*38fd1498Szrj sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z.__rep()); } 919*38fd1498Szrj#else 920*38fd1498Szrj template<typename _Tp> 921*38fd1498Szrj inline complex<_Tp> 922*38fd1498Szrj sqrt(const complex<_Tp>& __z) { return __complex_sqrt(__z); } 923*38fd1498Szrj#endif 924*38fd1498Szrj 925*38fd1498Szrj // 26.2.8/14 tan(__z): Return the complex tangent of __z. 926*38fd1498Szrj 927*38fd1498Szrj template<typename _Tp> 928*38fd1498Szrj inline complex<_Tp> 929*38fd1498Szrj __complex_tan(const complex<_Tp>& __z) 930*38fd1498Szrj { return std::sin(__z) / std::cos(__z); } 931*38fd1498Szrj 932*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 933*38fd1498Szrj inline __complex__ float 934*38fd1498Szrj __complex_tan(__complex__ float __z) { return __builtin_ctanf(__z); } 935*38fd1498Szrj 936*38fd1498Szrj inline __complex__ double 937*38fd1498Szrj __complex_tan(__complex__ double __z) { return __builtin_ctan(__z); } 938*38fd1498Szrj 939*38fd1498Szrj inline __complex__ long double 940*38fd1498Szrj __complex_tan(const __complex__ long double& __z) 941*38fd1498Szrj { return __builtin_ctanl(__z); } 942*38fd1498Szrj 943*38fd1498Szrj template<typename _Tp> 944*38fd1498Szrj inline complex<_Tp> 945*38fd1498Szrj tan(const complex<_Tp>& __z) { return __complex_tan(__z.__rep()); } 946*38fd1498Szrj#else 947*38fd1498Szrj template<typename _Tp> 948*38fd1498Szrj inline complex<_Tp> 949*38fd1498Szrj tan(const complex<_Tp>& __z) { return __complex_tan(__z); } 950*38fd1498Szrj#endif 951*38fd1498Szrj 952*38fd1498Szrj 953*38fd1498Szrj // 26.2.8/15 tanh(__z): Returns the hyperbolic tangent of __z. 954*38fd1498Szrj 955*38fd1498Szrj template<typename _Tp> 956*38fd1498Szrj inline complex<_Tp> 957*38fd1498Szrj __complex_tanh(const complex<_Tp>& __z) 958*38fd1498Szrj { return std::sinh(__z) / std::cosh(__z); } 959*38fd1498Szrj 960*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 961*38fd1498Szrj inline __complex__ float 962*38fd1498Szrj __complex_tanh(__complex__ float __z) { return __builtin_ctanhf(__z); } 963*38fd1498Szrj 964*38fd1498Szrj inline __complex__ double 965*38fd1498Szrj __complex_tanh(__complex__ double __z) { return __builtin_ctanh(__z); } 966*38fd1498Szrj 967*38fd1498Szrj inline __complex__ long double 968*38fd1498Szrj __complex_tanh(const __complex__ long double& __z) 969*38fd1498Szrj { return __builtin_ctanhl(__z); } 970*38fd1498Szrj 971*38fd1498Szrj template<typename _Tp> 972*38fd1498Szrj inline complex<_Tp> 973*38fd1498Szrj tanh(const complex<_Tp>& __z) { return __complex_tanh(__z.__rep()); } 974*38fd1498Szrj#else 975*38fd1498Szrj template<typename _Tp> 976*38fd1498Szrj inline complex<_Tp> 977*38fd1498Szrj tanh(const complex<_Tp>& __z) { return __complex_tanh(__z); } 978*38fd1498Szrj#endif 979*38fd1498Szrj 980*38fd1498Szrj 981*38fd1498Szrj // 26.2.8/9 pow(__x, __y): Returns the complex power base of __x 982*38fd1498Szrj // raised to the __y-th power. The branch 983*38fd1498Szrj // cut is on the negative axis. 984*38fd1498Szrj template<typename _Tp> 985*38fd1498Szrj complex<_Tp> 986*38fd1498Szrj __complex_pow_unsigned(complex<_Tp> __x, unsigned __n) 987*38fd1498Szrj { 988*38fd1498Szrj complex<_Tp> __y = __n % 2 ? __x : complex<_Tp>(1); 989*38fd1498Szrj 990*38fd1498Szrj while (__n >>= 1) 991*38fd1498Szrj { 992*38fd1498Szrj __x *= __x; 993*38fd1498Szrj if (__n % 2) 994*38fd1498Szrj __y *= __x; 995*38fd1498Szrj } 996*38fd1498Szrj 997*38fd1498Szrj return __y; 998*38fd1498Szrj } 999*38fd1498Szrj 1000*38fd1498Szrj // In C++11 mode we used to implement the resolution of 1001*38fd1498Szrj // DR 844. complex pow return type is ambiguous. 1002*38fd1498Szrj // thus the following overload was disabled in that mode. However, doing 1003*38fd1498Szrj // that causes all sorts of issues, see, for example: 1004*38fd1498Szrj // http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html 1005*38fd1498Szrj // and also PR57974. 1006*38fd1498Szrj template<typename _Tp> 1007*38fd1498Szrj inline complex<_Tp> 1008*38fd1498Szrj pow(const complex<_Tp>& __z, int __n) 1009*38fd1498Szrj { 1010*38fd1498Szrj return __n < 0 1011*38fd1498Szrj ? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n) 1012*38fd1498Szrj : std::__complex_pow_unsigned(__z, __n); 1013*38fd1498Szrj } 1014*38fd1498Szrj 1015*38fd1498Szrj template<typename _Tp> 1016*38fd1498Szrj complex<_Tp> 1017*38fd1498Szrj pow(const complex<_Tp>& __x, const _Tp& __y) 1018*38fd1498Szrj { 1019*38fd1498Szrj#if ! _GLIBCXX_USE_C99_COMPLEX 1020*38fd1498Szrj if (__x == _Tp()) 1021*38fd1498Szrj return _Tp(); 1022*38fd1498Szrj#endif 1023*38fd1498Szrj if (__x.imag() == _Tp() && __x.real() > _Tp()) 1024*38fd1498Szrj return pow(__x.real(), __y); 1025*38fd1498Szrj 1026*38fd1498Szrj complex<_Tp> __t = std::log(__x); 1027*38fd1498Szrj return std::polar<_Tp>(exp(__y * __t.real()), __y * __t.imag()); 1028*38fd1498Szrj } 1029*38fd1498Szrj 1030*38fd1498Szrj template<typename _Tp> 1031*38fd1498Szrj inline complex<_Tp> 1032*38fd1498Szrj __complex_pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1033*38fd1498Szrj { return __x == _Tp() ? _Tp() : std::exp(__y * std::log(__x)); } 1034*38fd1498Szrj 1035*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 1036*38fd1498Szrj inline __complex__ float 1037*38fd1498Szrj __complex_pow(__complex__ float __x, __complex__ float __y) 1038*38fd1498Szrj { return __builtin_cpowf(__x, __y); } 1039*38fd1498Szrj 1040*38fd1498Szrj inline __complex__ double 1041*38fd1498Szrj __complex_pow(__complex__ double __x, __complex__ double __y) 1042*38fd1498Szrj { return __builtin_cpow(__x, __y); } 1043*38fd1498Szrj 1044*38fd1498Szrj inline __complex__ long double 1045*38fd1498Szrj __complex_pow(const __complex__ long double& __x, 1046*38fd1498Szrj const __complex__ long double& __y) 1047*38fd1498Szrj { return __builtin_cpowl(__x, __y); } 1048*38fd1498Szrj 1049*38fd1498Szrj template<typename _Tp> 1050*38fd1498Szrj inline complex<_Tp> 1051*38fd1498Szrj pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1052*38fd1498Szrj { return __complex_pow(__x.__rep(), __y.__rep()); } 1053*38fd1498Szrj#else 1054*38fd1498Szrj template<typename _Tp> 1055*38fd1498Szrj inline complex<_Tp> 1056*38fd1498Szrj pow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1057*38fd1498Szrj { return __complex_pow(__x, __y); } 1058*38fd1498Szrj#endif 1059*38fd1498Szrj 1060*38fd1498Szrj template<typename _Tp> 1061*38fd1498Szrj inline complex<_Tp> 1062*38fd1498Szrj pow(const _Tp& __x, const complex<_Tp>& __y) 1063*38fd1498Szrj { 1064*38fd1498Szrj return __x > _Tp() ? std::polar<_Tp>(pow(__x, __y.real()), 1065*38fd1498Szrj __y.imag() * log(__x)) 1066*38fd1498Szrj : std::pow(complex<_Tp>(__x), __y); 1067*38fd1498Szrj } 1068*38fd1498Szrj 1069*38fd1498Szrj /// 26.2.3 complex specializations 1070*38fd1498Szrj /// complex<float> specialization 1071*38fd1498Szrj template<> 1072*38fd1498Szrj struct complex<float> 1073*38fd1498Szrj { 1074*38fd1498Szrj typedef float value_type; 1075*38fd1498Szrj typedef __complex__ float _ComplexT; 1076*38fd1498Szrj 1077*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { } 1078*38fd1498Szrj 1079*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(float __r = 0.0f, float __i = 0.0f) 1080*38fd1498Szrj#if __cplusplus >= 201103L 1081*38fd1498Szrj : _M_value{ __r, __i } { } 1082*38fd1498Szrj#else 1083*38fd1498Szrj { 1084*38fd1498Szrj __real__ _M_value = __r; 1085*38fd1498Szrj __imag__ _M_value = __i; 1086*38fd1498Szrj } 1087*38fd1498Szrj#endif 1088*38fd1498Szrj 1089*38fd1498Szrj explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&); 1090*38fd1498Szrj explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&); 1091*38fd1498Szrj 1092*38fd1498Szrj#if __cplusplus >= 201103L 1093*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1094*38fd1498Szrj // DR 387. std::complex over-encapsulated. 1095*38fd1498Szrj __attribute ((__abi_tag__ ("cxx11"))) 1096*38fd1498Szrj constexpr float 1097*38fd1498Szrj real() const { return __real__ _M_value; } 1098*38fd1498Szrj 1099*38fd1498Szrj __attribute ((__abi_tag__ ("cxx11"))) 1100*38fd1498Szrj constexpr float 1101*38fd1498Szrj imag() const { return __imag__ _M_value; } 1102*38fd1498Szrj#else 1103*38fd1498Szrj float& 1104*38fd1498Szrj real() { return __real__ _M_value; } 1105*38fd1498Szrj 1106*38fd1498Szrj const float& 1107*38fd1498Szrj real() const { return __real__ _M_value; } 1108*38fd1498Szrj 1109*38fd1498Szrj float& 1110*38fd1498Szrj imag() { return __imag__ _M_value; } 1111*38fd1498Szrj 1112*38fd1498Szrj const float& 1113*38fd1498Szrj imag() const { return __imag__ _M_value; } 1114*38fd1498Szrj#endif 1115*38fd1498Szrj 1116*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1117*38fd1498Szrj // DR 387. std::complex over-encapsulated. 1118*38fd1498Szrj void 1119*38fd1498Szrj real(float __val) { __real__ _M_value = __val; } 1120*38fd1498Szrj 1121*38fd1498Szrj void 1122*38fd1498Szrj imag(float __val) { __imag__ _M_value = __val; } 1123*38fd1498Szrj 1124*38fd1498Szrj complex& 1125*38fd1498Szrj operator=(float __f) 1126*38fd1498Szrj { 1127*38fd1498Szrj _M_value = __f; 1128*38fd1498Szrj return *this; 1129*38fd1498Szrj } 1130*38fd1498Szrj 1131*38fd1498Szrj complex& 1132*38fd1498Szrj operator+=(float __f) 1133*38fd1498Szrj { 1134*38fd1498Szrj _M_value += __f; 1135*38fd1498Szrj return *this; 1136*38fd1498Szrj } 1137*38fd1498Szrj 1138*38fd1498Szrj complex& 1139*38fd1498Szrj operator-=(float __f) 1140*38fd1498Szrj { 1141*38fd1498Szrj _M_value -= __f; 1142*38fd1498Szrj return *this; 1143*38fd1498Szrj } 1144*38fd1498Szrj 1145*38fd1498Szrj complex& 1146*38fd1498Szrj operator*=(float __f) 1147*38fd1498Szrj { 1148*38fd1498Szrj _M_value *= __f; 1149*38fd1498Szrj return *this; 1150*38fd1498Szrj } 1151*38fd1498Szrj 1152*38fd1498Szrj complex& 1153*38fd1498Szrj operator/=(float __f) 1154*38fd1498Szrj { 1155*38fd1498Szrj _M_value /= __f; 1156*38fd1498Szrj return *this; 1157*38fd1498Szrj } 1158*38fd1498Szrj 1159*38fd1498Szrj // Let the compiler synthesize the copy and assignment 1160*38fd1498Szrj // operator. It always does a pretty good job. 1161*38fd1498Szrj // complex& operator=(const complex&); 1162*38fd1498Szrj 1163*38fd1498Szrj template<typename _Tp> 1164*38fd1498Szrj complex& 1165*38fd1498Szrj operator=(const complex<_Tp>& __z) 1166*38fd1498Szrj { 1167*38fd1498Szrj __real__ _M_value = __z.real(); 1168*38fd1498Szrj __imag__ _M_value = __z.imag(); 1169*38fd1498Szrj return *this; 1170*38fd1498Szrj } 1171*38fd1498Szrj 1172*38fd1498Szrj template<typename _Tp> 1173*38fd1498Szrj complex& 1174*38fd1498Szrj operator+=(const complex<_Tp>& __z) 1175*38fd1498Szrj { 1176*38fd1498Szrj __real__ _M_value += __z.real(); 1177*38fd1498Szrj __imag__ _M_value += __z.imag(); 1178*38fd1498Szrj return *this; 1179*38fd1498Szrj } 1180*38fd1498Szrj 1181*38fd1498Szrj template<class _Tp> 1182*38fd1498Szrj complex& 1183*38fd1498Szrj operator-=(const complex<_Tp>& __z) 1184*38fd1498Szrj { 1185*38fd1498Szrj __real__ _M_value -= __z.real(); 1186*38fd1498Szrj __imag__ _M_value -= __z.imag(); 1187*38fd1498Szrj return *this; 1188*38fd1498Szrj } 1189*38fd1498Szrj 1190*38fd1498Szrj template<class _Tp> 1191*38fd1498Szrj complex& 1192*38fd1498Szrj operator*=(const complex<_Tp>& __z) 1193*38fd1498Szrj { 1194*38fd1498Szrj _ComplexT __t; 1195*38fd1498Szrj __real__ __t = __z.real(); 1196*38fd1498Szrj __imag__ __t = __z.imag(); 1197*38fd1498Szrj _M_value *= __t; 1198*38fd1498Szrj return *this; 1199*38fd1498Szrj } 1200*38fd1498Szrj 1201*38fd1498Szrj template<class _Tp> 1202*38fd1498Szrj complex& 1203*38fd1498Szrj operator/=(const complex<_Tp>& __z) 1204*38fd1498Szrj { 1205*38fd1498Szrj _ComplexT __t; 1206*38fd1498Szrj __real__ __t = __z.real(); 1207*38fd1498Szrj __imag__ __t = __z.imag(); 1208*38fd1498Szrj _M_value /= __t; 1209*38fd1498Szrj return *this; 1210*38fd1498Szrj } 1211*38fd1498Szrj 1212*38fd1498Szrj _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; } 1213*38fd1498Szrj 1214*38fd1498Szrj private: 1215*38fd1498Szrj _ComplexT _M_value; 1216*38fd1498Szrj }; 1217*38fd1498Szrj 1218*38fd1498Szrj /// 26.2.3 complex specializations 1219*38fd1498Szrj /// complex<double> specialization 1220*38fd1498Szrj template<> 1221*38fd1498Szrj struct complex<double> 1222*38fd1498Szrj { 1223*38fd1498Szrj typedef double value_type; 1224*38fd1498Szrj typedef __complex__ double _ComplexT; 1225*38fd1498Szrj 1226*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { } 1227*38fd1498Szrj 1228*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(double __r = 0.0, double __i = 0.0) 1229*38fd1498Szrj#if __cplusplus >= 201103L 1230*38fd1498Szrj : _M_value{ __r, __i } { } 1231*38fd1498Szrj#else 1232*38fd1498Szrj { 1233*38fd1498Szrj __real__ _M_value = __r; 1234*38fd1498Szrj __imag__ _M_value = __i; 1235*38fd1498Szrj } 1236*38fd1498Szrj#endif 1237*38fd1498Szrj 1238*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(const complex<float>& __z) 1239*38fd1498Szrj : _M_value(__z.__rep()) { } 1240*38fd1498Szrj 1241*38fd1498Szrj explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&); 1242*38fd1498Szrj 1243*38fd1498Szrj#if __cplusplus >= 201103L 1244*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1245*38fd1498Szrj // DR 387. std::complex over-encapsulated. 1246*38fd1498Szrj __attribute ((__abi_tag__ ("cxx11"))) 1247*38fd1498Szrj constexpr double 1248*38fd1498Szrj real() const { return __real__ _M_value; } 1249*38fd1498Szrj 1250*38fd1498Szrj __attribute ((__abi_tag__ ("cxx11"))) 1251*38fd1498Szrj constexpr double 1252*38fd1498Szrj imag() const { return __imag__ _M_value; } 1253*38fd1498Szrj#else 1254*38fd1498Szrj double& 1255*38fd1498Szrj real() { return __real__ _M_value; } 1256*38fd1498Szrj 1257*38fd1498Szrj const double& 1258*38fd1498Szrj real() const { return __real__ _M_value; } 1259*38fd1498Szrj 1260*38fd1498Szrj double& 1261*38fd1498Szrj imag() { return __imag__ _M_value; } 1262*38fd1498Szrj 1263*38fd1498Szrj const double& 1264*38fd1498Szrj imag() const { return __imag__ _M_value; } 1265*38fd1498Szrj#endif 1266*38fd1498Szrj 1267*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1268*38fd1498Szrj // DR 387. std::complex over-encapsulated. 1269*38fd1498Szrj void 1270*38fd1498Szrj real(double __val) { __real__ _M_value = __val; } 1271*38fd1498Szrj 1272*38fd1498Szrj void 1273*38fd1498Szrj imag(double __val) { __imag__ _M_value = __val; } 1274*38fd1498Szrj 1275*38fd1498Szrj complex& 1276*38fd1498Szrj operator=(double __d) 1277*38fd1498Szrj { 1278*38fd1498Szrj _M_value = __d; 1279*38fd1498Szrj return *this; 1280*38fd1498Szrj } 1281*38fd1498Szrj 1282*38fd1498Szrj complex& 1283*38fd1498Szrj operator+=(double __d) 1284*38fd1498Szrj { 1285*38fd1498Szrj _M_value += __d; 1286*38fd1498Szrj return *this; 1287*38fd1498Szrj } 1288*38fd1498Szrj 1289*38fd1498Szrj complex& 1290*38fd1498Szrj operator-=(double __d) 1291*38fd1498Szrj { 1292*38fd1498Szrj _M_value -= __d; 1293*38fd1498Szrj return *this; 1294*38fd1498Szrj } 1295*38fd1498Szrj 1296*38fd1498Szrj complex& 1297*38fd1498Szrj operator*=(double __d) 1298*38fd1498Szrj { 1299*38fd1498Szrj _M_value *= __d; 1300*38fd1498Szrj return *this; 1301*38fd1498Szrj } 1302*38fd1498Szrj 1303*38fd1498Szrj complex& 1304*38fd1498Szrj operator/=(double __d) 1305*38fd1498Szrj { 1306*38fd1498Szrj _M_value /= __d; 1307*38fd1498Szrj return *this; 1308*38fd1498Szrj } 1309*38fd1498Szrj 1310*38fd1498Szrj // The compiler will synthesize this, efficiently. 1311*38fd1498Szrj // complex& operator=(const complex&); 1312*38fd1498Szrj 1313*38fd1498Szrj template<typename _Tp> 1314*38fd1498Szrj complex& 1315*38fd1498Szrj operator=(const complex<_Tp>& __z) 1316*38fd1498Szrj { 1317*38fd1498Szrj __real__ _M_value = __z.real(); 1318*38fd1498Szrj __imag__ _M_value = __z.imag(); 1319*38fd1498Szrj return *this; 1320*38fd1498Szrj } 1321*38fd1498Szrj 1322*38fd1498Szrj template<typename _Tp> 1323*38fd1498Szrj complex& 1324*38fd1498Szrj operator+=(const complex<_Tp>& __z) 1325*38fd1498Szrj { 1326*38fd1498Szrj __real__ _M_value += __z.real(); 1327*38fd1498Szrj __imag__ _M_value += __z.imag(); 1328*38fd1498Szrj return *this; 1329*38fd1498Szrj } 1330*38fd1498Szrj 1331*38fd1498Szrj template<typename _Tp> 1332*38fd1498Szrj complex& 1333*38fd1498Szrj operator-=(const complex<_Tp>& __z) 1334*38fd1498Szrj { 1335*38fd1498Szrj __real__ _M_value -= __z.real(); 1336*38fd1498Szrj __imag__ _M_value -= __z.imag(); 1337*38fd1498Szrj return *this; 1338*38fd1498Szrj } 1339*38fd1498Szrj 1340*38fd1498Szrj template<typename _Tp> 1341*38fd1498Szrj complex& 1342*38fd1498Szrj operator*=(const complex<_Tp>& __z) 1343*38fd1498Szrj { 1344*38fd1498Szrj _ComplexT __t; 1345*38fd1498Szrj __real__ __t = __z.real(); 1346*38fd1498Szrj __imag__ __t = __z.imag(); 1347*38fd1498Szrj _M_value *= __t; 1348*38fd1498Szrj return *this; 1349*38fd1498Szrj } 1350*38fd1498Szrj 1351*38fd1498Szrj template<typename _Tp> 1352*38fd1498Szrj complex& 1353*38fd1498Szrj operator/=(const complex<_Tp>& __z) 1354*38fd1498Szrj { 1355*38fd1498Szrj _ComplexT __t; 1356*38fd1498Szrj __real__ __t = __z.real(); 1357*38fd1498Szrj __imag__ __t = __z.imag(); 1358*38fd1498Szrj _M_value /= __t; 1359*38fd1498Szrj return *this; 1360*38fd1498Szrj } 1361*38fd1498Szrj 1362*38fd1498Szrj _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; } 1363*38fd1498Szrj 1364*38fd1498Szrj private: 1365*38fd1498Szrj _ComplexT _M_value; 1366*38fd1498Szrj }; 1367*38fd1498Szrj 1368*38fd1498Szrj /// 26.2.3 complex specializations 1369*38fd1498Szrj /// complex<long double> specialization 1370*38fd1498Szrj template<> 1371*38fd1498Szrj struct complex<long double> 1372*38fd1498Szrj { 1373*38fd1498Szrj typedef long double value_type; 1374*38fd1498Szrj typedef __complex__ long double _ComplexT; 1375*38fd1498Szrj 1376*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(_ComplexT __z) : _M_value(__z) { } 1377*38fd1498Szrj 1378*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(long double __r = 0.0L, 1379*38fd1498Szrj long double __i = 0.0L) 1380*38fd1498Szrj#if __cplusplus >= 201103L 1381*38fd1498Szrj : _M_value{ __r, __i } { } 1382*38fd1498Szrj#else 1383*38fd1498Szrj { 1384*38fd1498Szrj __real__ _M_value = __r; 1385*38fd1498Szrj __imag__ _M_value = __i; 1386*38fd1498Szrj } 1387*38fd1498Szrj#endif 1388*38fd1498Szrj 1389*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(const complex<float>& __z) 1390*38fd1498Szrj : _M_value(__z.__rep()) { } 1391*38fd1498Szrj 1392*38fd1498Szrj _GLIBCXX_CONSTEXPR complex(const complex<double>& __z) 1393*38fd1498Szrj : _M_value(__z.__rep()) { } 1394*38fd1498Szrj 1395*38fd1498Szrj#if __cplusplus >= 201103L 1396*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1397*38fd1498Szrj // DR 387. std::complex over-encapsulated. 1398*38fd1498Szrj __attribute ((__abi_tag__ ("cxx11"))) 1399*38fd1498Szrj constexpr long double 1400*38fd1498Szrj real() const { return __real__ _M_value; } 1401*38fd1498Szrj 1402*38fd1498Szrj __attribute ((__abi_tag__ ("cxx11"))) 1403*38fd1498Szrj constexpr long double 1404*38fd1498Szrj imag() const { return __imag__ _M_value; } 1405*38fd1498Szrj#else 1406*38fd1498Szrj long double& 1407*38fd1498Szrj real() { return __real__ _M_value; } 1408*38fd1498Szrj 1409*38fd1498Szrj const long double& 1410*38fd1498Szrj real() const { return __real__ _M_value; } 1411*38fd1498Szrj 1412*38fd1498Szrj long double& 1413*38fd1498Szrj imag() { return __imag__ _M_value; } 1414*38fd1498Szrj 1415*38fd1498Szrj const long double& 1416*38fd1498Szrj imag() const { return __imag__ _M_value; } 1417*38fd1498Szrj#endif 1418*38fd1498Szrj 1419*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 1420*38fd1498Szrj // DR 387. std::complex over-encapsulated. 1421*38fd1498Szrj void 1422*38fd1498Szrj real(long double __val) { __real__ _M_value = __val; } 1423*38fd1498Szrj 1424*38fd1498Szrj void 1425*38fd1498Szrj imag(long double __val) { __imag__ _M_value = __val; } 1426*38fd1498Szrj 1427*38fd1498Szrj complex& 1428*38fd1498Szrj operator=(long double __r) 1429*38fd1498Szrj { 1430*38fd1498Szrj _M_value = __r; 1431*38fd1498Szrj return *this; 1432*38fd1498Szrj } 1433*38fd1498Szrj 1434*38fd1498Szrj complex& 1435*38fd1498Szrj operator+=(long double __r) 1436*38fd1498Szrj { 1437*38fd1498Szrj _M_value += __r; 1438*38fd1498Szrj return *this; 1439*38fd1498Szrj } 1440*38fd1498Szrj 1441*38fd1498Szrj complex& 1442*38fd1498Szrj operator-=(long double __r) 1443*38fd1498Szrj { 1444*38fd1498Szrj _M_value -= __r; 1445*38fd1498Szrj return *this; 1446*38fd1498Szrj } 1447*38fd1498Szrj 1448*38fd1498Szrj complex& 1449*38fd1498Szrj operator*=(long double __r) 1450*38fd1498Szrj { 1451*38fd1498Szrj _M_value *= __r; 1452*38fd1498Szrj return *this; 1453*38fd1498Szrj } 1454*38fd1498Szrj 1455*38fd1498Szrj complex& 1456*38fd1498Szrj operator/=(long double __r) 1457*38fd1498Szrj { 1458*38fd1498Szrj _M_value /= __r; 1459*38fd1498Szrj return *this; 1460*38fd1498Szrj } 1461*38fd1498Szrj 1462*38fd1498Szrj // The compiler knows how to do this efficiently 1463*38fd1498Szrj // complex& operator=(const complex&); 1464*38fd1498Szrj 1465*38fd1498Szrj template<typename _Tp> 1466*38fd1498Szrj complex& 1467*38fd1498Szrj operator=(const complex<_Tp>& __z) 1468*38fd1498Szrj { 1469*38fd1498Szrj __real__ _M_value = __z.real(); 1470*38fd1498Szrj __imag__ _M_value = __z.imag(); 1471*38fd1498Szrj return *this; 1472*38fd1498Szrj } 1473*38fd1498Szrj 1474*38fd1498Szrj template<typename _Tp> 1475*38fd1498Szrj complex& 1476*38fd1498Szrj operator+=(const complex<_Tp>& __z) 1477*38fd1498Szrj { 1478*38fd1498Szrj __real__ _M_value += __z.real(); 1479*38fd1498Szrj __imag__ _M_value += __z.imag(); 1480*38fd1498Szrj return *this; 1481*38fd1498Szrj } 1482*38fd1498Szrj 1483*38fd1498Szrj template<typename _Tp> 1484*38fd1498Szrj complex& 1485*38fd1498Szrj operator-=(const complex<_Tp>& __z) 1486*38fd1498Szrj { 1487*38fd1498Szrj __real__ _M_value -= __z.real(); 1488*38fd1498Szrj __imag__ _M_value -= __z.imag(); 1489*38fd1498Szrj return *this; 1490*38fd1498Szrj } 1491*38fd1498Szrj 1492*38fd1498Szrj template<typename _Tp> 1493*38fd1498Szrj complex& 1494*38fd1498Szrj operator*=(const complex<_Tp>& __z) 1495*38fd1498Szrj { 1496*38fd1498Szrj _ComplexT __t; 1497*38fd1498Szrj __real__ __t = __z.real(); 1498*38fd1498Szrj __imag__ __t = __z.imag(); 1499*38fd1498Szrj _M_value *= __t; 1500*38fd1498Szrj return *this; 1501*38fd1498Szrj } 1502*38fd1498Szrj 1503*38fd1498Szrj template<typename _Tp> 1504*38fd1498Szrj complex& 1505*38fd1498Szrj operator/=(const complex<_Tp>& __z) 1506*38fd1498Szrj { 1507*38fd1498Szrj _ComplexT __t; 1508*38fd1498Szrj __real__ __t = __z.real(); 1509*38fd1498Szrj __imag__ __t = __z.imag(); 1510*38fd1498Szrj _M_value /= __t; 1511*38fd1498Szrj return *this; 1512*38fd1498Szrj } 1513*38fd1498Szrj 1514*38fd1498Szrj _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; } 1515*38fd1498Szrj 1516*38fd1498Szrj private: 1517*38fd1498Szrj _ComplexT _M_value; 1518*38fd1498Szrj }; 1519*38fd1498Szrj 1520*38fd1498Szrj // These bits have to be at the end of this file, so that the 1521*38fd1498Szrj // specializations have all been defined. 1522*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 1523*38fd1498Szrj complex<float>::complex(const complex<double>& __z) 1524*38fd1498Szrj : _M_value(__z.__rep()) { } 1525*38fd1498Szrj 1526*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 1527*38fd1498Szrj complex<float>::complex(const complex<long double>& __z) 1528*38fd1498Szrj : _M_value(__z.__rep()) { } 1529*38fd1498Szrj 1530*38fd1498Szrj inline _GLIBCXX_CONSTEXPR 1531*38fd1498Szrj complex<double>::complex(const complex<long double>& __z) 1532*38fd1498Szrj : _M_value(__z.__rep()) { } 1533*38fd1498Szrj 1534*38fd1498Szrj // Inhibit implicit instantiations for required instantiations, 1535*38fd1498Szrj // which are defined via explicit instantiations elsewhere. 1536*38fd1498Szrj // NB: This syntax is a GNU extension. 1537*38fd1498Szrj#if _GLIBCXX_EXTERN_TEMPLATE 1538*38fd1498Szrj extern template istream& operator>>(istream&, complex<float>&); 1539*38fd1498Szrj extern template ostream& operator<<(ostream&, const complex<float>&); 1540*38fd1498Szrj extern template istream& operator>>(istream&, complex<double>&); 1541*38fd1498Szrj extern template ostream& operator<<(ostream&, const complex<double>&); 1542*38fd1498Szrj extern template istream& operator>>(istream&, complex<long double>&); 1543*38fd1498Szrj extern template ostream& operator<<(ostream&, const complex<long double>&); 1544*38fd1498Szrj 1545*38fd1498Szrj#ifdef _GLIBCXX_USE_WCHAR_T 1546*38fd1498Szrj extern template wistream& operator>>(wistream&, complex<float>&); 1547*38fd1498Szrj extern template wostream& operator<<(wostream&, const complex<float>&); 1548*38fd1498Szrj extern template wistream& operator>>(wistream&, complex<double>&); 1549*38fd1498Szrj extern template wostream& operator<<(wostream&, const complex<double>&); 1550*38fd1498Szrj extern template wistream& operator>>(wistream&, complex<long double>&); 1551*38fd1498Szrj extern template wostream& operator<<(wostream&, const complex<long double>&); 1552*38fd1498Szrj#endif 1553*38fd1498Szrj#endif 1554*38fd1498Szrj 1555*38fd1498Szrj // @} group complex_numbers 1556*38fd1498Szrj 1557*38fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 1558*38fd1498Szrj} // namespace 1559*38fd1498Szrj 1560*38fd1498Szrjnamespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 1561*38fd1498Szrj{ 1562*38fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION 1563*38fd1498Szrj 1564*38fd1498Szrj // See ext/type_traits.h for the primary template. 1565*38fd1498Szrj template<typename _Tp, typename _Up> 1566*38fd1498Szrj struct __promote_2<std::complex<_Tp>, _Up> 1567*38fd1498Szrj { 1568*38fd1498Szrj public: 1569*38fd1498Szrj typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type; 1570*38fd1498Szrj }; 1571*38fd1498Szrj 1572*38fd1498Szrj template<typename _Tp, typename _Up> 1573*38fd1498Szrj struct __promote_2<_Tp, std::complex<_Up> > 1574*38fd1498Szrj { 1575*38fd1498Szrj public: 1576*38fd1498Szrj typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type; 1577*38fd1498Szrj }; 1578*38fd1498Szrj 1579*38fd1498Szrj template<typename _Tp, typename _Up> 1580*38fd1498Szrj struct __promote_2<std::complex<_Tp>, std::complex<_Up> > 1581*38fd1498Szrj { 1582*38fd1498Szrj public: 1583*38fd1498Szrj typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type; 1584*38fd1498Szrj }; 1585*38fd1498Szrj 1586*38fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 1587*38fd1498Szrj} // namespace 1588*38fd1498Szrj 1589*38fd1498Szrj#if __cplusplus >= 201103L 1590*38fd1498Szrj 1591*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default) 1592*38fd1498Szrj{ 1593*38fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION 1594*38fd1498Szrj 1595*38fd1498Szrj // Forward declarations. 1596*38fd1498Szrj template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&); 1597*38fd1498Szrj template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&); 1598*38fd1498Szrj template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&); 1599*38fd1498Szrj 1600*38fd1498Szrj template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&); 1601*38fd1498Szrj template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&); 1602*38fd1498Szrj template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&); 1603*38fd1498Szrj // DR 595. 1604*38fd1498Szrj template<typename _Tp> _Tp fabs(const std::complex<_Tp>&); 1605*38fd1498Szrj 1606*38fd1498Szrj template<typename _Tp> 1607*38fd1498Szrj inline std::complex<_Tp> 1608*38fd1498Szrj __complex_acos(const std::complex<_Tp>& __z) 1609*38fd1498Szrj { 1610*38fd1498Szrj const std::complex<_Tp> __t = std::asin(__z); 1611*38fd1498Szrj const _Tp __pi_2 = 1.5707963267948966192313216916397514L; 1612*38fd1498Szrj return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag()); 1613*38fd1498Szrj } 1614*38fd1498Szrj 1615*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 1616*38fd1498Szrj inline __complex__ float 1617*38fd1498Szrj __complex_acos(__complex__ float __z) 1618*38fd1498Szrj { return __builtin_cacosf(__z); } 1619*38fd1498Szrj 1620*38fd1498Szrj inline __complex__ double 1621*38fd1498Szrj __complex_acos(__complex__ double __z) 1622*38fd1498Szrj { return __builtin_cacos(__z); } 1623*38fd1498Szrj 1624*38fd1498Szrj inline __complex__ long double 1625*38fd1498Szrj __complex_acos(const __complex__ long double& __z) 1626*38fd1498Szrj { return __builtin_cacosl(__z); } 1627*38fd1498Szrj 1628*38fd1498Szrj template<typename _Tp> 1629*38fd1498Szrj inline std::complex<_Tp> 1630*38fd1498Szrj acos(const std::complex<_Tp>& __z) 1631*38fd1498Szrj { return __complex_acos(__z.__rep()); } 1632*38fd1498Szrj#else 1633*38fd1498Szrj /// acos(__z) [8.1.2]. 1634*38fd1498Szrj // Effects: Behaves the same as C99 function cacos, defined 1635*38fd1498Szrj // in subclause 7.3.5.1. 1636*38fd1498Szrj template<typename _Tp> 1637*38fd1498Szrj inline std::complex<_Tp> 1638*38fd1498Szrj acos(const std::complex<_Tp>& __z) 1639*38fd1498Szrj { return __complex_acos(__z); } 1640*38fd1498Szrj#endif 1641*38fd1498Szrj 1642*38fd1498Szrj template<typename _Tp> 1643*38fd1498Szrj inline std::complex<_Tp> 1644*38fd1498Szrj __complex_asin(const std::complex<_Tp>& __z) 1645*38fd1498Szrj { 1646*38fd1498Szrj std::complex<_Tp> __t(-__z.imag(), __z.real()); 1647*38fd1498Szrj __t = std::asinh(__t); 1648*38fd1498Szrj return std::complex<_Tp>(__t.imag(), -__t.real()); 1649*38fd1498Szrj } 1650*38fd1498Szrj 1651*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 1652*38fd1498Szrj inline __complex__ float 1653*38fd1498Szrj __complex_asin(__complex__ float __z) 1654*38fd1498Szrj { return __builtin_casinf(__z); } 1655*38fd1498Szrj 1656*38fd1498Szrj inline __complex__ double 1657*38fd1498Szrj __complex_asin(__complex__ double __z) 1658*38fd1498Szrj { return __builtin_casin(__z); } 1659*38fd1498Szrj 1660*38fd1498Szrj inline __complex__ long double 1661*38fd1498Szrj __complex_asin(const __complex__ long double& __z) 1662*38fd1498Szrj { return __builtin_casinl(__z); } 1663*38fd1498Szrj 1664*38fd1498Szrj template<typename _Tp> 1665*38fd1498Szrj inline std::complex<_Tp> 1666*38fd1498Szrj asin(const std::complex<_Tp>& __z) 1667*38fd1498Szrj { return __complex_asin(__z.__rep()); } 1668*38fd1498Szrj#else 1669*38fd1498Szrj /// asin(__z) [8.1.3]. 1670*38fd1498Szrj // Effects: Behaves the same as C99 function casin, defined 1671*38fd1498Szrj // in subclause 7.3.5.2. 1672*38fd1498Szrj template<typename _Tp> 1673*38fd1498Szrj inline std::complex<_Tp> 1674*38fd1498Szrj asin(const std::complex<_Tp>& __z) 1675*38fd1498Szrj { return __complex_asin(__z); } 1676*38fd1498Szrj#endif 1677*38fd1498Szrj 1678*38fd1498Szrj template<typename _Tp> 1679*38fd1498Szrj std::complex<_Tp> 1680*38fd1498Szrj __complex_atan(const std::complex<_Tp>& __z) 1681*38fd1498Szrj { 1682*38fd1498Szrj const _Tp __r2 = __z.real() * __z.real(); 1683*38fd1498Szrj const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag(); 1684*38fd1498Szrj 1685*38fd1498Szrj _Tp __num = __z.imag() + _Tp(1.0); 1686*38fd1498Szrj _Tp __den = __z.imag() - _Tp(1.0); 1687*38fd1498Szrj 1688*38fd1498Szrj __num = __r2 + __num * __num; 1689*38fd1498Szrj __den = __r2 + __den * __den; 1690*38fd1498Szrj 1691*38fd1498Szrj return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x), 1692*38fd1498Szrj _Tp(0.25) * log(__num / __den)); 1693*38fd1498Szrj } 1694*38fd1498Szrj 1695*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 1696*38fd1498Szrj inline __complex__ float 1697*38fd1498Szrj __complex_atan(__complex__ float __z) 1698*38fd1498Szrj { return __builtin_catanf(__z); } 1699*38fd1498Szrj 1700*38fd1498Szrj inline __complex__ double 1701*38fd1498Szrj __complex_atan(__complex__ double __z) 1702*38fd1498Szrj { return __builtin_catan(__z); } 1703*38fd1498Szrj 1704*38fd1498Szrj inline __complex__ long double 1705*38fd1498Szrj __complex_atan(const __complex__ long double& __z) 1706*38fd1498Szrj { return __builtin_catanl(__z); } 1707*38fd1498Szrj 1708*38fd1498Szrj template<typename _Tp> 1709*38fd1498Szrj inline std::complex<_Tp> 1710*38fd1498Szrj atan(const std::complex<_Tp>& __z) 1711*38fd1498Szrj { return __complex_atan(__z.__rep()); } 1712*38fd1498Szrj#else 1713*38fd1498Szrj /// atan(__z) [8.1.4]. 1714*38fd1498Szrj // Effects: Behaves the same as C99 function catan, defined 1715*38fd1498Szrj // in subclause 7.3.5.3. 1716*38fd1498Szrj template<typename _Tp> 1717*38fd1498Szrj inline std::complex<_Tp> 1718*38fd1498Szrj atan(const std::complex<_Tp>& __z) 1719*38fd1498Szrj { return __complex_atan(__z); } 1720*38fd1498Szrj#endif 1721*38fd1498Szrj 1722*38fd1498Szrj template<typename _Tp> 1723*38fd1498Szrj std::complex<_Tp> 1724*38fd1498Szrj __complex_acosh(const std::complex<_Tp>& __z) 1725*38fd1498Szrj { 1726*38fd1498Szrj // Kahan's formula. 1727*38fd1498Szrj return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0))) 1728*38fd1498Szrj + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0)))); 1729*38fd1498Szrj } 1730*38fd1498Szrj 1731*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 1732*38fd1498Szrj inline __complex__ float 1733*38fd1498Szrj __complex_acosh(__complex__ float __z) 1734*38fd1498Szrj { return __builtin_cacoshf(__z); } 1735*38fd1498Szrj 1736*38fd1498Szrj inline __complex__ double 1737*38fd1498Szrj __complex_acosh(__complex__ double __z) 1738*38fd1498Szrj { return __builtin_cacosh(__z); } 1739*38fd1498Szrj 1740*38fd1498Szrj inline __complex__ long double 1741*38fd1498Szrj __complex_acosh(const __complex__ long double& __z) 1742*38fd1498Szrj { return __builtin_cacoshl(__z); } 1743*38fd1498Szrj 1744*38fd1498Szrj template<typename _Tp> 1745*38fd1498Szrj inline std::complex<_Tp> 1746*38fd1498Szrj acosh(const std::complex<_Tp>& __z) 1747*38fd1498Szrj { return __complex_acosh(__z.__rep()); } 1748*38fd1498Szrj#else 1749*38fd1498Szrj /// acosh(__z) [8.1.5]. 1750*38fd1498Szrj // Effects: Behaves the same as C99 function cacosh, defined 1751*38fd1498Szrj // in subclause 7.3.6.1. 1752*38fd1498Szrj template<typename _Tp> 1753*38fd1498Szrj inline std::complex<_Tp> 1754*38fd1498Szrj acosh(const std::complex<_Tp>& __z) 1755*38fd1498Szrj { return __complex_acosh(__z); } 1756*38fd1498Szrj#endif 1757*38fd1498Szrj 1758*38fd1498Szrj template<typename _Tp> 1759*38fd1498Szrj std::complex<_Tp> 1760*38fd1498Szrj __complex_asinh(const std::complex<_Tp>& __z) 1761*38fd1498Szrj { 1762*38fd1498Szrj std::complex<_Tp> __t((__z.real() - __z.imag()) 1763*38fd1498Szrj * (__z.real() + __z.imag()) + _Tp(1.0), 1764*38fd1498Szrj _Tp(2.0) * __z.real() * __z.imag()); 1765*38fd1498Szrj __t = std::sqrt(__t); 1766*38fd1498Szrj 1767*38fd1498Szrj return std::log(__t + __z); 1768*38fd1498Szrj } 1769*38fd1498Szrj 1770*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 1771*38fd1498Szrj inline __complex__ float 1772*38fd1498Szrj __complex_asinh(__complex__ float __z) 1773*38fd1498Szrj { return __builtin_casinhf(__z); } 1774*38fd1498Szrj 1775*38fd1498Szrj inline __complex__ double 1776*38fd1498Szrj __complex_asinh(__complex__ double __z) 1777*38fd1498Szrj { return __builtin_casinh(__z); } 1778*38fd1498Szrj 1779*38fd1498Szrj inline __complex__ long double 1780*38fd1498Szrj __complex_asinh(const __complex__ long double& __z) 1781*38fd1498Szrj { return __builtin_casinhl(__z); } 1782*38fd1498Szrj 1783*38fd1498Szrj template<typename _Tp> 1784*38fd1498Szrj inline std::complex<_Tp> 1785*38fd1498Szrj asinh(const std::complex<_Tp>& __z) 1786*38fd1498Szrj { return __complex_asinh(__z.__rep()); } 1787*38fd1498Szrj#else 1788*38fd1498Szrj /// asinh(__z) [8.1.6]. 1789*38fd1498Szrj // Effects: Behaves the same as C99 function casin, defined 1790*38fd1498Szrj // in subclause 7.3.6.2. 1791*38fd1498Szrj template<typename _Tp> 1792*38fd1498Szrj inline std::complex<_Tp> 1793*38fd1498Szrj asinh(const std::complex<_Tp>& __z) 1794*38fd1498Szrj { return __complex_asinh(__z); } 1795*38fd1498Szrj#endif 1796*38fd1498Szrj 1797*38fd1498Szrj template<typename _Tp> 1798*38fd1498Szrj std::complex<_Tp> 1799*38fd1498Szrj __complex_atanh(const std::complex<_Tp>& __z) 1800*38fd1498Szrj { 1801*38fd1498Szrj const _Tp __i2 = __z.imag() * __z.imag(); 1802*38fd1498Szrj const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real(); 1803*38fd1498Szrj 1804*38fd1498Szrj _Tp __num = _Tp(1.0) + __z.real(); 1805*38fd1498Szrj _Tp __den = _Tp(1.0) - __z.real(); 1806*38fd1498Szrj 1807*38fd1498Szrj __num = __i2 + __num * __num; 1808*38fd1498Szrj __den = __i2 + __den * __den; 1809*38fd1498Szrj 1810*38fd1498Szrj return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)), 1811*38fd1498Szrj _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x)); 1812*38fd1498Szrj } 1813*38fd1498Szrj 1814*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 1815*38fd1498Szrj inline __complex__ float 1816*38fd1498Szrj __complex_atanh(__complex__ float __z) 1817*38fd1498Szrj { return __builtin_catanhf(__z); } 1818*38fd1498Szrj 1819*38fd1498Szrj inline __complex__ double 1820*38fd1498Szrj __complex_atanh(__complex__ double __z) 1821*38fd1498Szrj { return __builtin_catanh(__z); } 1822*38fd1498Szrj 1823*38fd1498Szrj inline __complex__ long double 1824*38fd1498Szrj __complex_atanh(const __complex__ long double& __z) 1825*38fd1498Szrj { return __builtin_catanhl(__z); } 1826*38fd1498Szrj 1827*38fd1498Szrj template<typename _Tp> 1828*38fd1498Szrj inline std::complex<_Tp> 1829*38fd1498Szrj atanh(const std::complex<_Tp>& __z) 1830*38fd1498Szrj { return __complex_atanh(__z.__rep()); } 1831*38fd1498Szrj#else 1832*38fd1498Szrj /// atanh(__z) [8.1.7]. 1833*38fd1498Szrj // Effects: Behaves the same as C99 function catanh, defined 1834*38fd1498Szrj // in subclause 7.3.6.3. 1835*38fd1498Szrj template<typename _Tp> 1836*38fd1498Szrj inline std::complex<_Tp> 1837*38fd1498Szrj atanh(const std::complex<_Tp>& __z) 1838*38fd1498Szrj { return __complex_atanh(__z); } 1839*38fd1498Szrj#endif 1840*38fd1498Szrj 1841*38fd1498Szrj template<typename _Tp> 1842*38fd1498Szrj inline _Tp 1843*38fd1498Szrj /// fabs(__z) [8.1.8]. 1844*38fd1498Szrj // Effects: Behaves the same as C99 function cabs, defined 1845*38fd1498Szrj // in subclause 7.3.8.1. 1846*38fd1498Szrj fabs(const std::complex<_Tp>& __z) 1847*38fd1498Szrj { return std::abs(__z); } 1848*38fd1498Szrj 1849*38fd1498Szrj /// Additional overloads [8.1.9]. 1850*38fd1498Szrj template<typename _Tp> 1851*38fd1498Szrj inline typename __gnu_cxx::__promote<_Tp>::__type 1852*38fd1498Szrj arg(_Tp __x) 1853*38fd1498Szrj { 1854*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1855*38fd1498Szrj#if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) 1856*38fd1498Szrj return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L) 1857*38fd1498Szrj : __type(); 1858*38fd1498Szrj#else 1859*38fd1498Szrj return std::arg(std::complex<__type>(__x)); 1860*38fd1498Szrj#endif 1861*38fd1498Szrj } 1862*38fd1498Szrj 1863*38fd1498Szrj template<typename _Tp> 1864*38fd1498Szrj _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type 1865*38fd1498Szrj imag(_Tp) 1866*38fd1498Szrj { return _Tp(); } 1867*38fd1498Szrj 1868*38fd1498Szrj template<typename _Tp> 1869*38fd1498Szrj inline typename __gnu_cxx::__promote<_Tp>::__type 1870*38fd1498Szrj norm(_Tp __x) 1871*38fd1498Szrj { 1872*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1873*38fd1498Szrj return __type(__x) * __type(__x); 1874*38fd1498Szrj } 1875*38fd1498Szrj 1876*38fd1498Szrj template<typename _Tp> 1877*38fd1498Szrj _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type 1878*38fd1498Szrj real(_Tp __x) 1879*38fd1498Szrj { return __x; } 1880*38fd1498Szrj 1881*38fd1498Szrj template<typename _Tp, typename _Up> 1882*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 1883*38fd1498Szrj pow(const std::complex<_Tp>& __x, const _Up& __y) 1884*38fd1498Szrj { 1885*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1886*38fd1498Szrj return std::pow(std::complex<__type>(__x), __type(__y)); 1887*38fd1498Szrj } 1888*38fd1498Szrj 1889*38fd1498Szrj template<typename _Tp, typename _Up> 1890*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 1891*38fd1498Szrj pow(const _Tp& __x, const std::complex<_Up>& __y) 1892*38fd1498Szrj { 1893*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1894*38fd1498Szrj return std::pow(__type(__x), std::complex<__type>(__y)); 1895*38fd1498Szrj } 1896*38fd1498Szrj 1897*38fd1498Szrj template<typename _Tp, typename _Up> 1898*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 1899*38fd1498Szrj pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y) 1900*38fd1498Szrj { 1901*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 1902*38fd1498Szrj return std::pow(std::complex<__type>(__x), 1903*38fd1498Szrj std::complex<__type>(__y)); 1904*38fd1498Szrj } 1905*38fd1498Szrj 1906*38fd1498Szrj // Forward declarations. 1907*38fd1498Szrj // DR 781. 1908*38fd1498Szrj template<typename _Tp> std::complex<_Tp> proj(const std::complex<_Tp>&); 1909*38fd1498Szrj 1910*38fd1498Szrj template<typename _Tp> 1911*38fd1498Szrj std::complex<_Tp> 1912*38fd1498Szrj __complex_proj(const std::complex<_Tp>& __z) 1913*38fd1498Szrj { 1914*38fd1498Szrj const _Tp __den = (__z.real() * __z.real() 1915*38fd1498Szrj + __z.imag() * __z.imag() + _Tp(1.0)); 1916*38fd1498Szrj 1917*38fd1498Szrj return std::complex<_Tp>((_Tp(2.0) * __z.real()) / __den, 1918*38fd1498Szrj (_Tp(2.0) * __z.imag()) / __den); 1919*38fd1498Szrj } 1920*38fd1498Szrj 1921*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX 1922*38fd1498Szrj inline __complex__ float 1923*38fd1498Szrj __complex_proj(__complex__ float __z) 1924*38fd1498Szrj { return __builtin_cprojf(__z); } 1925*38fd1498Szrj 1926*38fd1498Szrj inline __complex__ double 1927*38fd1498Szrj __complex_proj(__complex__ double __z) 1928*38fd1498Szrj { return __builtin_cproj(__z); } 1929*38fd1498Szrj 1930*38fd1498Szrj inline __complex__ long double 1931*38fd1498Szrj __complex_proj(const __complex__ long double& __z) 1932*38fd1498Szrj { return __builtin_cprojl(__z); } 1933*38fd1498Szrj 1934*38fd1498Szrj template<typename _Tp> 1935*38fd1498Szrj inline std::complex<_Tp> 1936*38fd1498Szrj proj(const std::complex<_Tp>& __z) 1937*38fd1498Szrj { return __complex_proj(__z.__rep()); } 1938*38fd1498Szrj#else 1939*38fd1498Szrj template<typename _Tp> 1940*38fd1498Szrj inline std::complex<_Tp> 1941*38fd1498Szrj proj(const std::complex<_Tp>& __z) 1942*38fd1498Szrj { return __complex_proj(__z); } 1943*38fd1498Szrj#endif 1944*38fd1498Szrj 1945*38fd1498Szrj template<typename _Tp> 1946*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type> 1947*38fd1498Szrj proj(_Tp __x) 1948*38fd1498Szrj { 1949*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1950*38fd1498Szrj return std::proj(std::complex<__type>(__x)); 1951*38fd1498Szrj } 1952*38fd1498Szrj 1953*38fd1498Szrj template<typename _Tp> 1954*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type> 1955*38fd1498Szrj conj(_Tp __x) 1956*38fd1498Szrj { 1957*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 1958*38fd1498Szrj return std::complex<__type>(__x, -__type()); 1959*38fd1498Szrj } 1960*38fd1498Szrj 1961*38fd1498Szrj#if __cplusplus > 201103L 1962*38fd1498Szrj 1963*38fd1498Szrjinline namespace literals { 1964*38fd1498Szrjinline namespace complex_literals { 1965*38fd1498Szrj#pragma GCC diagnostic push 1966*38fd1498Szrj#pragma GCC diagnostic ignored "-Wliteral-suffix" 1967*38fd1498Szrj#define __cpp_lib_complex_udls 201309 1968*38fd1498Szrj 1969*38fd1498Szrj constexpr std::complex<float> 1970*38fd1498Szrj operator""if(long double __num) 1971*38fd1498Szrj { return std::complex<float>{0.0F, static_cast<float>(__num)}; } 1972*38fd1498Szrj 1973*38fd1498Szrj constexpr std::complex<float> 1974*38fd1498Szrj operator""if(unsigned long long __num) 1975*38fd1498Szrj { return std::complex<float>{0.0F, static_cast<float>(__num)}; } 1976*38fd1498Szrj 1977*38fd1498Szrj constexpr std::complex<double> 1978*38fd1498Szrj operator""i(long double __num) 1979*38fd1498Szrj { return std::complex<double>{0.0, static_cast<double>(__num)}; } 1980*38fd1498Szrj 1981*38fd1498Szrj constexpr std::complex<double> 1982*38fd1498Szrj operator""i(unsigned long long __num) 1983*38fd1498Szrj { return std::complex<double>{0.0, static_cast<double>(__num)}; } 1984*38fd1498Szrj 1985*38fd1498Szrj constexpr std::complex<long double> 1986*38fd1498Szrj operator""il(long double __num) 1987*38fd1498Szrj { return std::complex<long double>{0.0L, __num}; } 1988*38fd1498Szrj 1989*38fd1498Szrj constexpr std::complex<long double> 1990*38fd1498Szrj operator""il(unsigned long long __num) 1991*38fd1498Szrj { return std::complex<long double>{0.0L, static_cast<long double>(__num)}; } 1992*38fd1498Szrj 1993*38fd1498Szrj#pragma GCC diagnostic pop 1994*38fd1498Szrj} // inline namespace complex_literals 1995*38fd1498Szrj} // inline namespace literals 1996*38fd1498Szrj 1997*38fd1498Szrj#endif // C++14 1998*38fd1498Szrj 1999*38fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 2000*38fd1498Szrj} // namespace 2001*38fd1498Szrj 2002*38fd1498Szrj#endif // C++11 2003*38fd1498Szrj 2004*38fd1498Szrj#endif /* _GLIBCXX_COMPLEX */ 2005