1*38fd1498Szrj// TR1 complex -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj// Copyright (C) 2006-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 tr1/complex 26*38fd1498Szrj * This is a TR1 C++ Library header. 27*38fd1498Szrj */ 28*38fd1498Szrj 29*38fd1498Szrj#ifndef _GLIBCXX_TR1_COMPLEX 30*38fd1498Szrj#define _GLIBCXX_TR1_COMPLEX 1 31*38fd1498Szrj 32*38fd1498Szrj#pragma GCC system_header 33*38fd1498Szrj 34*38fd1498Szrj#include <complex> 35*38fd1498Szrj 36*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default) 37*38fd1498Szrj{ 38*38fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION 39*38fd1498Szrj 40*38fd1498Szrjnamespace tr1 41*38fd1498Szrj{ 42*38fd1498Szrj /** 43*38fd1498Szrj * @addtogroup complex_numbers 44*38fd1498Szrj * @{ 45*38fd1498Szrj */ 46*38fd1498Szrj 47*38fd1498Szrj#if __cplusplus >= 201103L 48*38fd1498Szrj using std::acos; 49*38fd1498Szrj using std::asin; 50*38fd1498Szrj using std::atan; 51*38fd1498Szrj using std::acosh; 52*38fd1498Szrj using std::asinh; 53*38fd1498Szrj using std::atanh; 54*38fd1498Szrj#else 55*38fd1498Szrj template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&); 56*38fd1498Szrj template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&); 57*38fd1498Szrj template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&); 58*38fd1498Szrj template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&); 59*38fd1498Szrj template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&); 60*38fd1498Szrj template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&); 61*38fd1498Szrj#endif 62*38fd1498Szrj 63*38fd1498Szrj // The std::fabs return type in C++11 mode is different (just _Tp). 64*38fd1498Szrj template<typename _Tp> std::complex<_Tp> fabs(const std::complex<_Tp>&); 65*38fd1498Szrj 66*38fd1498Szrj#if __cplusplus < 201103L 67*38fd1498Szrj template<typename _Tp> 68*38fd1498Szrj inline std::complex<_Tp> 69*38fd1498Szrj __complex_acos(const std::complex<_Tp>& __z) 70*38fd1498Szrj { 71*38fd1498Szrj const std::complex<_Tp> __t = std::tr1::asin(__z); 72*38fd1498Szrj const _Tp __pi_2 = 1.5707963267948966192313216916397514L; 73*38fd1498Szrj return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag()); 74*38fd1498Szrj } 75*38fd1498Szrj 76*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 77*38fd1498Szrj inline __complex__ float 78*38fd1498Szrj __complex_acos(__complex__ float __z) 79*38fd1498Szrj { return __builtin_cacosf(__z); } 80*38fd1498Szrj 81*38fd1498Szrj inline __complex__ double 82*38fd1498Szrj __complex_acos(__complex__ double __z) 83*38fd1498Szrj { return __builtin_cacos(__z); } 84*38fd1498Szrj 85*38fd1498Szrj inline __complex__ long double 86*38fd1498Szrj __complex_acos(const __complex__ long double& __z) 87*38fd1498Szrj { return __builtin_cacosl(__z); } 88*38fd1498Szrj 89*38fd1498Szrj template<typename _Tp> 90*38fd1498Szrj inline std::complex<_Tp> 91*38fd1498Szrj acos(const std::complex<_Tp>& __z) 92*38fd1498Szrj { return __complex_acos(__z.__rep()); } 93*38fd1498Szrj#else 94*38fd1498Szrj /// acos(__z) [8.1.2]. 95*38fd1498Szrj // Effects: Behaves the same as C99 function cacos, defined 96*38fd1498Szrj // in subclause 7.3.5.1. 97*38fd1498Szrj template<typename _Tp> 98*38fd1498Szrj inline std::complex<_Tp> 99*38fd1498Szrj acos(const std::complex<_Tp>& __z) 100*38fd1498Szrj { return __complex_acos(__z); } 101*38fd1498Szrj#endif 102*38fd1498Szrj 103*38fd1498Szrj template<typename _Tp> 104*38fd1498Szrj inline std::complex<_Tp> 105*38fd1498Szrj __complex_asin(const std::complex<_Tp>& __z) 106*38fd1498Szrj { 107*38fd1498Szrj std::complex<_Tp> __t(-__z.imag(), __z.real()); 108*38fd1498Szrj __t = std::tr1::asinh(__t); 109*38fd1498Szrj return std::complex<_Tp>(__t.imag(), -__t.real()); 110*38fd1498Szrj } 111*38fd1498Szrj 112*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 113*38fd1498Szrj inline __complex__ float 114*38fd1498Szrj __complex_asin(__complex__ float __z) 115*38fd1498Szrj { return __builtin_casinf(__z); } 116*38fd1498Szrj 117*38fd1498Szrj inline __complex__ double 118*38fd1498Szrj __complex_asin(__complex__ double __z) 119*38fd1498Szrj { return __builtin_casin(__z); } 120*38fd1498Szrj 121*38fd1498Szrj inline __complex__ long double 122*38fd1498Szrj __complex_asin(const __complex__ long double& __z) 123*38fd1498Szrj { return __builtin_casinl(__z); } 124*38fd1498Szrj 125*38fd1498Szrj template<typename _Tp> 126*38fd1498Szrj inline std::complex<_Tp> 127*38fd1498Szrj asin(const std::complex<_Tp>& __z) 128*38fd1498Szrj { return __complex_asin(__z.__rep()); } 129*38fd1498Szrj#else 130*38fd1498Szrj /// asin(__z) [8.1.3]. 131*38fd1498Szrj // Effects: Behaves the same as C99 function casin, defined 132*38fd1498Szrj // in subclause 7.3.5.2. 133*38fd1498Szrj template<typename _Tp> 134*38fd1498Szrj inline std::complex<_Tp> 135*38fd1498Szrj asin(const std::complex<_Tp>& __z) 136*38fd1498Szrj { return __complex_asin(__z); } 137*38fd1498Szrj#endif 138*38fd1498Szrj 139*38fd1498Szrj template<typename _Tp> 140*38fd1498Szrj std::complex<_Tp> 141*38fd1498Szrj __complex_atan(const std::complex<_Tp>& __z) 142*38fd1498Szrj { 143*38fd1498Szrj const _Tp __r2 = __z.real() * __z.real(); 144*38fd1498Szrj const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag(); 145*38fd1498Szrj 146*38fd1498Szrj _Tp __num = __z.imag() + _Tp(1.0); 147*38fd1498Szrj _Tp __den = __z.imag() - _Tp(1.0); 148*38fd1498Szrj 149*38fd1498Szrj __num = __r2 + __num * __num; 150*38fd1498Szrj __den = __r2 + __den * __den; 151*38fd1498Szrj 152*38fd1498Szrj return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x), 153*38fd1498Szrj _Tp(0.25) * log(__num / __den)); 154*38fd1498Szrj } 155*38fd1498Szrj 156*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 157*38fd1498Szrj inline __complex__ float 158*38fd1498Szrj __complex_atan(__complex__ float __z) 159*38fd1498Szrj { return __builtin_catanf(__z); } 160*38fd1498Szrj 161*38fd1498Szrj inline __complex__ double 162*38fd1498Szrj __complex_atan(__complex__ double __z) 163*38fd1498Szrj { return __builtin_catan(__z); } 164*38fd1498Szrj 165*38fd1498Szrj inline __complex__ long double 166*38fd1498Szrj __complex_atan(const __complex__ long double& __z) 167*38fd1498Szrj { return __builtin_catanl(__z); } 168*38fd1498Szrj 169*38fd1498Szrj template<typename _Tp> 170*38fd1498Szrj inline std::complex<_Tp> 171*38fd1498Szrj atan(const std::complex<_Tp>& __z) 172*38fd1498Szrj { return __complex_atan(__z.__rep()); } 173*38fd1498Szrj#else 174*38fd1498Szrj /// atan(__z) [8.1.4]. 175*38fd1498Szrj // Effects: Behaves the same as C99 function catan, defined 176*38fd1498Szrj // in subclause 7.3.5.3. 177*38fd1498Szrj template<typename _Tp> 178*38fd1498Szrj inline std::complex<_Tp> 179*38fd1498Szrj atan(const std::complex<_Tp>& __z) 180*38fd1498Szrj { return __complex_atan(__z); } 181*38fd1498Szrj#endif 182*38fd1498Szrj 183*38fd1498Szrj template<typename _Tp> 184*38fd1498Szrj std::complex<_Tp> 185*38fd1498Szrj __complex_acosh(const std::complex<_Tp>& __z) 186*38fd1498Szrj { 187*38fd1498Szrj // Kahan's formula. 188*38fd1498Szrj return _Tp(2.0) * std::log(std::sqrt(_Tp(0.5) * (__z + _Tp(1.0))) 189*38fd1498Szrj + std::sqrt(_Tp(0.5) * (__z - _Tp(1.0)))); 190*38fd1498Szrj } 191*38fd1498Szrj 192*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 193*38fd1498Szrj inline __complex__ float 194*38fd1498Szrj __complex_acosh(__complex__ float __z) 195*38fd1498Szrj { return __builtin_cacoshf(__z); } 196*38fd1498Szrj 197*38fd1498Szrj inline __complex__ double 198*38fd1498Szrj __complex_acosh(__complex__ double __z) 199*38fd1498Szrj { return __builtin_cacosh(__z); } 200*38fd1498Szrj 201*38fd1498Szrj inline __complex__ long double 202*38fd1498Szrj __complex_acosh(const __complex__ long double& __z) 203*38fd1498Szrj { return __builtin_cacoshl(__z); } 204*38fd1498Szrj 205*38fd1498Szrj template<typename _Tp> 206*38fd1498Szrj inline std::complex<_Tp> 207*38fd1498Szrj acosh(const std::complex<_Tp>& __z) 208*38fd1498Szrj { return __complex_acosh(__z.__rep()); } 209*38fd1498Szrj#else 210*38fd1498Szrj /// acosh(__z) [8.1.5]. 211*38fd1498Szrj // Effects: Behaves the same as C99 function cacosh, defined 212*38fd1498Szrj // in subclause 7.3.6.1. 213*38fd1498Szrj template<typename _Tp> 214*38fd1498Szrj inline std::complex<_Tp> 215*38fd1498Szrj acosh(const std::complex<_Tp>& __z) 216*38fd1498Szrj { return __complex_acosh(__z); } 217*38fd1498Szrj#endif 218*38fd1498Szrj 219*38fd1498Szrj template<typename _Tp> 220*38fd1498Szrj std::complex<_Tp> 221*38fd1498Szrj __complex_asinh(const std::complex<_Tp>& __z) 222*38fd1498Szrj { 223*38fd1498Szrj std::complex<_Tp> __t((__z.real() - __z.imag()) 224*38fd1498Szrj * (__z.real() + __z.imag()) + _Tp(1.0), 225*38fd1498Szrj _Tp(2.0) * __z.real() * __z.imag()); 226*38fd1498Szrj __t = std::sqrt(__t); 227*38fd1498Szrj 228*38fd1498Szrj return std::log(__t + __z); 229*38fd1498Szrj } 230*38fd1498Szrj 231*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 232*38fd1498Szrj inline __complex__ float 233*38fd1498Szrj __complex_asinh(__complex__ float __z) 234*38fd1498Szrj { return __builtin_casinhf(__z); } 235*38fd1498Szrj 236*38fd1498Szrj inline __complex__ double 237*38fd1498Szrj __complex_asinh(__complex__ double __z) 238*38fd1498Szrj { return __builtin_casinh(__z); } 239*38fd1498Szrj 240*38fd1498Szrj inline __complex__ long double 241*38fd1498Szrj __complex_asinh(const __complex__ long double& __z) 242*38fd1498Szrj { return __builtin_casinhl(__z); } 243*38fd1498Szrj 244*38fd1498Szrj template<typename _Tp> 245*38fd1498Szrj inline std::complex<_Tp> 246*38fd1498Szrj asinh(const std::complex<_Tp>& __z) 247*38fd1498Szrj { return __complex_asinh(__z.__rep()); } 248*38fd1498Szrj#else 249*38fd1498Szrj /// asinh(__z) [8.1.6]. 250*38fd1498Szrj // Effects: Behaves the same as C99 function casin, defined 251*38fd1498Szrj // in subclause 7.3.6.2. 252*38fd1498Szrj template<typename _Tp> 253*38fd1498Szrj inline std::complex<_Tp> 254*38fd1498Szrj asinh(const std::complex<_Tp>& __z) 255*38fd1498Szrj { return __complex_asinh(__z); } 256*38fd1498Szrj#endif 257*38fd1498Szrj 258*38fd1498Szrj template<typename _Tp> 259*38fd1498Szrj std::complex<_Tp> 260*38fd1498Szrj __complex_atanh(const std::complex<_Tp>& __z) 261*38fd1498Szrj { 262*38fd1498Szrj const _Tp __i2 = __z.imag() * __z.imag(); 263*38fd1498Szrj const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real(); 264*38fd1498Szrj 265*38fd1498Szrj _Tp __num = _Tp(1.0) + __z.real(); 266*38fd1498Szrj _Tp __den = _Tp(1.0) - __z.real(); 267*38fd1498Szrj 268*38fd1498Szrj __num = __i2 + __num * __num; 269*38fd1498Szrj __den = __i2 + __den * __den; 270*38fd1498Szrj 271*38fd1498Szrj return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)), 272*38fd1498Szrj _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x)); 273*38fd1498Szrj } 274*38fd1498Szrj 275*38fd1498Szrj#if _GLIBCXX_USE_C99_COMPLEX_TR1 276*38fd1498Szrj inline __complex__ float 277*38fd1498Szrj __complex_atanh(__complex__ float __z) 278*38fd1498Szrj { return __builtin_catanhf(__z); } 279*38fd1498Szrj 280*38fd1498Szrj inline __complex__ double 281*38fd1498Szrj __complex_atanh(__complex__ double __z) 282*38fd1498Szrj { return __builtin_catanh(__z); } 283*38fd1498Szrj 284*38fd1498Szrj inline __complex__ long double 285*38fd1498Szrj __complex_atanh(const __complex__ long double& __z) 286*38fd1498Szrj { return __builtin_catanhl(__z); } 287*38fd1498Szrj 288*38fd1498Szrj template<typename _Tp> 289*38fd1498Szrj inline std::complex<_Tp> 290*38fd1498Szrj atanh(const std::complex<_Tp>& __z) 291*38fd1498Szrj { return __complex_atanh(__z.__rep()); } 292*38fd1498Szrj#else 293*38fd1498Szrj /// atanh(__z) [8.1.7]. 294*38fd1498Szrj // Effects: Behaves the same as C99 function catanh, defined 295*38fd1498Szrj // in subclause 7.3.6.3. 296*38fd1498Szrj template<typename _Tp> 297*38fd1498Szrj inline std::complex<_Tp> 298*38fd1498Szrj atanh(const std::complex<_Tp>& __z) 299*38fd1498Szrj { return __complex_atanh(__z); } 300*38fd1498Szrj#endif 301*38fd1498Szrj 302*38fd1498Szrj#endif // C++11 303*38fd1498Szrj 304*38fd1498Szrj template<typename _Tp> 305*38fd1498Szrj inline std::complex<_Tp> 306*38fd1498Szrj /// fabs(__z) [8.1.8]. 307*38fd1498Szrj // Effects: Behaves the same as C99 function cabs, defined 308*38fd1498Szrj // in subclause 7.3.8.1. 309*38fd1498Szrj fabs(const std::complex<_Tp>& __z) 310*38fd1498Szrj { return std::abs(__z); } 311*38fd1498Szrj 312*38fd1498Szrj /// Additional overloads [8.1.9]. 313*38fd1498Szrj#if __cplusplus < 201103L 314*38fd1498Szrj 315*38fd1498Szrj template<typename _Tp> 316*38fd1498Szrj inline typename __gnu_cxx::__promote<_Tp>::__type 317*38fd1498Szrj arg(_Tp __x) 318*38fd1498Szrj { 319*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 320*38fd1498Szrj#if (_GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) 321*38fd1498Szrj return std::signbit(__x) ? __type(3.1415926535897932384626433832795029L) 322*38fd1498Szrj : __type(); 323*38fd1498Szrj#else 324*38fd1498Szrj return std::arg(std::complex<__type>(__x)); 325*38fd1498Szrj#endif 326*38fd1498Szrj } 327*38fd1498Szrj 328*38fd1498Szrj template<typename _Tp> 329*38fd1498Szrj inline typename __gnu_cxx::__promote<_Tp>::__type 330*38fd1498Szrj imag(_Tp) 331*38fd1498Szrj { return _Tp(); } 332*38fd1498Szrj 333*38fd1498Szrj template<typename _Tp> 334*38fd1498Szrj inline typename __gnu_cxx::__promote<_Tp>::__type 335*38fd1498Szrj norm(_Tp __x) 336*38fd1498Szrj { 337*38fd1498Szrj typedef typename __gnu_cxx::__promote<_Tp>::__type __type; 338*38fd1498Szrj return __type(__x) * __type(__x); 339*38fd1498Szrj } 340*38fd1498Szrj 341*38fd1498Szrj template<typename _Tp> 342*38fd1498Szrj inline typename __gnu_cxx::__promote<_Tp>::__type 343*38fd1498Szrj real(_Tp __x) 344*38fd1498Szrj { return __x; } 345*38fd1498Szrj 346*38fd1498Szrj#endif 347*38fd1498Szrj 348*38fd1498Szrj template<typename _Tp, typename _Up> 349*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 350*38fd1498Szrj pow(const std::complex<_Tp>& __x, const _Up& __y) 351*38fd1498Szrj { 352*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 353*38fd1498Szrj return std::pow(std::complex<__type>(__x), __type(__y)); 354*38fd1498Szrj } 355*38fd1498Szrj 356*38fd1498Szrj template<typename _Tp, typename _Up> 357*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 358*38fd1498Szrj pow(const _Tp& __x, const std::complex<_Up>& __y) 359*38fd1498Szrj { 360*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 361*38fd1498Szrj return std::pow(__type(__x), std::complex<__type>(__y)); 362*38fd1498Szrj } 363*38fd1498Szrj 364*38fd1498Szrj template<typename _Tp, typename _Up> 365*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 366*38fd1498Szrj pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y) 367*38fd1498Szrj { 368*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 369*38fd1498Szrj return std::pow(std::complex<__type>(__x), 370*38fd1498Szrj std::complex<__type>(__y)); 371*38fd1498Szrj } 372*38fd1498Szrj 373*38fd1498Szrj using std::arg; 374*38fd1498Szrj 375*38fd1498Szrj template<typename _Tp> 376*38fd1498Szrj inline std::complex<_Tp> 377*38fd1498Szrj conj(const std::complex<_Tp>& __z) 378*38fd1498Szrj { return std::conj(__z); } 379*38fd1498Szrj 380*38fd1498Szrj template<typename _Tp> 381*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type> 382*38fd1498Szrj conj(_Tp __x) 383*38fd1498Szrj { return __x; } 384*38fd1498Szrj 385*38fd1498Szrj using std::imag; 386*38fd1498Szrj using std::norm; 387*38fd1498Szrj using std::polar; 388*38fd1498Szrj 389*38fd1498Szrj template<typename _Tp, typename _Up> 390*38fd1498Szrj inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> 391*38fd1498Szrj polar(const _Tp& __rho, const _Up& __theta) 392*38fd1498Szrj { 393*38fd1498Szrj typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 394*38fd1498Szrj return std::polar(__type(__rho), __type(__theta)); 395*38fd1498Szrj } 396*38fd1498Szrj 397*38fd1498Szrj using std::real; 398*38fd1498Szrj 399*38fd1498Szrj template<typename _Tp> 400*38fd1498Szrj inline std::complex<_Tp> 401*38fd1498Szrj pow(const std::complex<_Tp>& __x, const _Tp& __y) 402*38fd1498Szrj { return std::pow(__x, __y); } 403*38fd1498Szrj 404*38fd1498Szrj template<typename _Tp> 405*38fd1498Szrj inline std::complex<_Tp> 406*38fd1498Szrj pow(const _Tp& __x, const std::complex<_Tp>& __y) 407*38fd1498Szrj { return std::pow(__x, __y); } 408*38fd1498Szrj 409*38fd1498Szrj template<typename _Tp> 410*38fd1498Szrj inline std::complex<_Tp> 411*38fd1498Szrj pow(const std::complex<_Tp>& __x, const std::complex<_Tp>& __y) 412*38fd1498Szrj { return std::pow(__x, __y); } 413*38fd1498Szrj 414*38fd1498Szrj// @} group complex_numbers 415*38fd1498Szrj} 416*38fd1498Szrj 417*38fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION 418*38fd1498Szrj} 419*38fd1498Szrj 420*38fd1498Szrj#endif // _GLIBCXX_TR1_COMPLEX 421