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