af13a7a6ec
2007-03-04 Benjamin Kosnik <bkoz@redhat.com> * acinclude.m4 (GLIBCXX_ENABLE_CHEADERS): Add c_global. * configure.host (c_model): Set default to c_global. * configure: Regenerate. * include/Makefile.am (c_compatibility_headers_extra): Make conditional on GLIBCXX_C_HEADERS_COMPATIBILITY. (c_base_headers_extra): Make conditional on GLIBCXX_C_HEADERS_EXTRA. (c_compatibility_headers): Make conditional on c/c_std/c_global. * include/Makefile.in: Regenerate. * docs/html/configopts.html: Add c_global information to --enable-cheaders. Eventually, "c_std" should mean "C" includes that are in namespace std, with optional C++ "C" compatibility includes to inject into global scope. And "c_global" should mean "C" includes that are in the global namespace, with C++ includes injecting into namespace std and no C++ "C" compatibility includes. 2007-03-04 Benjamin Kosnik <bkoz@redhat.com> * include/bits/c++config: Add _GLIBCXX_NAMEPACE_C. Add _GLIBCXX_NAMESPACE_ASSOCIATION_CXX200x. Add _GLIBCXX_TR1 as namespace macro. Add namespace associations for std::__cxx200x conditionally. * include/c_compatibility/assert.h: Correct doxygen markup, conditionalize the global injections on _GLIBCXX_NAMESPACE_C. * include/c_compatibility/ctype.h: Same. * include/c_compatibility/errno.h: Same. * include/c_compatibility/float.h: Same. * include/c_compatibility/iso646.h: Same. * include/c_compatibility/limits.h: Same. * include/c_compatibility/locale.h: Same. * include/c_compatibility/math.h: Same. * include/c_compatibility/setjmp.h: Same. * include/c_compatibility/signal.h: Same. * include/c_compatibility/stdarg.h: Same. * include/c_compatibility/stddef.h: Same. * include/c_compatibility/stdio.h: Same. * include/c_compatibility/stdlib.h: Same. * include/c_compatibility/string.h: Same. * include/c_compatibility/time.h: Same. * include/c_compatibility/wchar.h: Same. * include/c_compatibility/wctype.h: Same. * include/c_compatibility/complex.h: Add. * include/c_compatibility/fenv.h: Same. * include/c_compatibility/inttypes.h: Same. * include/c_compatibility/stdbool.h: Same. * include/c_compatibility/stdint.h: Same. * include/c_compatibility/tgmath.h: Same. * include/c_global/cassert: Add, use include_next, use C++0x features if -std=c++0x. * include/c_global/cctype: Same. * include/c_global/cerrno: Same. * include/c_global/cfloat: Same. * include/c_global/ciso646: Same. * include/c_global/climits: Same. * include/c_global/clocale: Same. * include/c_global/cmath: Same. * include/c_global/cmath.tcc: Same. * include/c_global/csetjmp: Same. * include/c_global/csignal: Same. * include/c_global/cstdarg: Same. * include/c_global/cstddef: Same. * include/c_global/cstdio: Same. * include/c_global/cstdlib: Same. * include/c_global/cstring: Same. * include/c_global/ctime: Same. * include/c_global/cwchar: Same. * include/c_global/cwctype: Same. * include/c_global/ccomplex: Add. * include/c_global/cfenv: Add. * include/c_global/cinttypes: Add. * include/c_global/cstdbool: Add. * include/c_global/cstdint: Add. * include/c_global/ctgmath: Add. * include/std/algorithm: Use C++0x features if -std=c++0x. * include/std/bitset: Same. * include/std/complex: Same. * include/std/deque: Same. * include/std/fstream: Same. * include/std/functional: Same. * include/std/iomanip: Same. * include/std/ios: Same. * include/std/iosfwd: Same. * include/std/iostream: Same. * include/std/istream: Same. * include/std/iterator: Same. * include/std/limits: Same. * include/std/list: Same. * include/std/locale: Same. * include/std/map: Same. * include/std/memory: Same. * include/std/numeric: Same. * include/std/ostream: Same. * include/std/queue: Same. * include/std/set: Same. * include/std/sstream: Same. * include/std/stack: Same. * include/std/stdexcept: Same. * include/std/streambuf: Same. * include/std/string: Same. * include/std/utility: Same. * include/std/valarray: Same. * include/std/vector: Same. * include/std/array: Add. * include/std/random: Add. * include/std/regex: Add. * include/std/tuple: Add. * include/std/type_traits: Add. * include/std/unordered_map: Add. * include/std/unordered_set: Add. * include/std/c++0x_warning.h: Add. * include/tr1/array: Switch namespaces based on _GLIBCXX_TR1. * include/tr1/boost_shared_ptr.h: Same. * include/tr1/cctype: Same. * include/tr1/cfenv: Same. * include/tr1/cinttypes: Same. * include/tr1/cmath: Same. * include/tr1/common.h: Same. * include/tr1/complex: Same. * include/tr1/cstdint: Same. * include/tr1/cstdio: Same. * include/tr1/cstdlib: Same. * include/tr1/cwchar: Same. * include/tr1/cwctype: Same. * include/tr1/functional: Same. * include/tr1/functional_hash.h: Same. * include/tr1/functional_iterate.h: Same. * include/tr1/hashtable: Same. * include/tr1/hashtable_policy.h: Same. * include/tr1/math.h: Same. * include/tr1/memory: Same. * include/tr1/random: Same. * include/tr1/random.tcc: Same. * include/tr1/ref_fwd.h: Same. * include/tr1/repeat.h: Same. * include/tr1/stdlib.h: Same. * include/tr1/tuple: Same. * include/tr1/tuple_iterate.h: Same. * include/tr1/type_traits: Same. * include/tr1/type_traits_fwd.h: Same. * include/tr1/unordered_map: Same. * include/tr1/unordered_set: Same. * include/tr1/utility: Same. * include/tr1/ccomplex: Add. * include/tr1/complex.h: Add. * include/tr1/regex: Add. * include/Makefile.am: Add C++0x headers, "C" compatibility headers. * include/Makefile.in: Regenerate. * testsuite/tr1/headers.cc: Add in regex/complex. * testsuite/17_intro/headers/c++200x/all.cc: New. * testsuite/17_intro/headers/c++200x/all_multiple_inclusion.cc: Same. * testsuite/17_intro/using_namespace_std_tr1_neg.cc: Same. * testsuite/18_support/headers/cstdbool/std_c++0x_neg.cc: Same. * testsuite/18_support/headers/cstdint/std_c++0x_neg.cc: Same. * testsuite/18_support/headers/cstdint/types_std_c++0x.cc: Same. * testsuite/20_util/enable_shared_from_this/requirements/ explicit_instantiation.cc: Same. * testsuite/20_util/headers/functional/types_std_c++0x.cc: Same. * testsuite/20_util/headers/functional/ using_namespace_std_placeholders.cc: Same. * testsuite/20_util/headers/memory/types_std_c++0x.cc: Same. * testsuite/20_util/headers/type_traits/std_c++0x_neg.cc: Same. * testsuite/20_util/headers/type_traits/types_std_c++0x.cc: Same. * testsuite/20_util/shared_ptr/requirements/ explicit_instantiation.cc: Same. * testsuite/20_util/weak_ptr/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/array/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/hash/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/headers/array/std_c++0x_neg.cc: Same. * testsuite/23_containers/headers/tuple/std_c++0x_neg.cc: Same. * testsuite/23_containers/headers/tuple/types_std_c++0x.cc: Same. * testsuite/23_containers/headers/unordered_map/std_c++0x_neg.cc: Same. * testsuite/23_containers/headers/unordered_set/std_c++0x_neg.cc: Same. * testsuite/23_containers/tuple/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/unordered_map/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/unordered_multimap/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/unordered_multiset/requirements/ explicit_instantiation.cc: Same. * testsuite/23_containers/unordered_set/requirements/ explicit_instantiation.cc: Same. * testsuite/26_numerics/headers/ccomplex/std_c++0x_neg.cc: Same. * testsuite/26_numerics/headers/cfenv/std_c++0x_neg.cc: Same. * testsuite/26_numerics/headers/cfenv/types_std_c++0x.cc: Same. * testsuite/26_numerics/headers/cmath/types_std_c++0x.cc: Same. * testsuite/26_numerics/headers/cstdlib/types_std_c++0x.cc: Same. * testsuite/26_numerics/headers/ctgmath/std_c++0x_neg.cc: Same. * testsuite/26_numerics/headers/random/std_c++0x_neg.cc: Same. * testsuite/26_numerics/headers/random/types_std_c++0x.cc: Same. * testsuite/27_io/headers/cinttypes/std_c++0x_neg.cc: Same. * testsuite/27_io/headers/cinttypes/types_std_c++0x.cc: Same. * testsuite/28_regex/headers/regex/std_c++0x_neg.cc: Same. * testsuite/tr1/8_c_compatibility/cfenv/types.cc: Rename ... * testsuite/tr1/8_c_compatibility/cinttypes/types.cc: Same. * testsuite/tr1/8_c_compatibility/cmath/types.cc: Same. * testsuite/tr1/8_c_compatibility/cstdint/types.cc: Same. * testsuite/tr1/8_c_compatibility/cstdlib/types.cc: Same. * testsuite/tr1/8_c_compatibility/cfenv/types_std_tr1.cc: ...to this. * testsuite/tr1/8_c_compatibility/cinttypes/types_std_tr1.cc: Same. * testsuite/tr1/8_c_compatibility/cmath/types_std_tr1.cc: Same. * testsuite/tr1/8_c_compatibility/cstdint/types_std_tr1.cc: Same. * testsuite/tr1/8_c_compatibility/cstdlib/types_std_tr1.cc: Same. From-SVN: r122533
410 lines
12 KiB
C++
410 lines
12 KiB
C++
// TR1 complex -*- C++ -*-
|
|
|
|
// Copyright (C) 2006, 2007 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library is free
|
|
// software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 2, or (at your option)
|
|
// any later version.
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License along
|
|
// with this library; see the file COPYING. If not, write to the Free
|
|
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
// USA.
|
|
|
|
// As a special exception, you may use this file as part of a free software
|
|
// library without restriction. Specifically, if other files instantiate
|
|
// templates or use macros or inline functions from this file, or you compile
|
|
// this file and link it with other files to produce an executable, this
|
|
// file does not by itself cause the resulting executable to be covered by
|
|
// the GNU General Public License. This exception does not however
|
|
// invalidate any other reasons why the executable file might be covered by
|
|
// the GNU General Public License.
|
|
|
|
/** @file tr1/complex
|
|
* This is a TR1 C++ Library header.
|
|
*/
|
|
|
|
#ifndef _TR1_COMPLEX
|
|
#define _TR1_COMPLEX 1
|
|
|
|
#include <complex>
|
|
#include <tr1/common.h>
|
|
|
|
// namespace std::tr1
|
|
namespace std
|
|
{
|
|
_GLIBCXX_BEGIN_NAMESPACE(_GLIBCXX_TR1)
|
|
|
|
// Forward declarations.
|
|
template<typename _Tp> std::complex<_Tp> acos(const std::complex<_Tp>&);
|
|
template<typename _Tp> std::complex<_Tp> asin(const std::complex<_Tp>&);
|
|
template<typename _Tp> std::complex<_Tp> atan(const std::complex<_Tp>&);
|
|
|
|
template<typename _Tp> std::complex<_Tp> acosh(const std::complex<_Tp>&);
|
|
template<typename _Tp> std::complex<_Tp> asinh(const std::complex<_Tp>&);
|
|
template<typename _Tp> std::complex<_Tp> atanh(const std::complex<_Tp>&);
|
|
template<typename _Tp> std::complex<_Tp> fabs(const std::complex<_Tp>&);
|
|
|
|
/// @brief acos(__z) [8.1.2].
|
|
// Effects: Behaves the same as C99 function cacos, defined
|
|
// in subclause 7.3.5.1.
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
__complex_acos(const std::complex<_Tp>& __z)
|
|
{
|
|
const std::complex<_Tp> __t = std::_GLIBCXX_TR1::asin(__z);
|
|
const _Tp __pi_2 = 1.5707963267948966192313216916397514L;
|
|
return std::complex<_Tp>(__pi_2 - __t.real(), -__t.imag());
|
|
}
|
|
|
|
#if _GLIBCXX_USE_C99_COMPLEX_TR1
|
|
inline __complex__ float
|
|
__complex_acos(__complex__ float __z)
|
|
{ return __builtin_cacosf(__z); }
|
|
|
|
inline __complex__ double
|
|
__complex_acos(__complex__ double __z)
|
|
{ return __builtin_cacos(__z); }
|
|
|
|
inline __complex__ long double
|
|
__complex_acos(const __complex__ long double& __z)
|
|
{ return __builtin_cacosl(__z); }
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
acos(const std::complex<_Tp>& __z)
|
|
{ return __complex_acos(__z.__rep()); }
|
|
#else
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
acos(const std::complex<_Tp>& __z)
|
|
{ return __complex_acos(__z); }
|
|
#endif
|
|
|
|
/// @brief asin(__z) [8.1.3].
|
|
// Effects: Behaves the same as C99 function casin, defined
|
|
// in subclause 7.3.5.2.
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
__complex_asin(const std::complex<_Tp>& __z)
|
|
{
|
|
std::complex<_Tp> __t(-__z.imag(), __z.real());
|
|
__t = std::_GLIBCXX_TR1::asinh(__t);
|
|
return std::complex<_Tp>(__t.imag(), -__t.real());
|
|
}
|
|
|
|
#if _GLIBCXX_USE_C99_COMPLEX_TR1
|
|
inline __complex__ float
|
|
__complex_asin(__complex__ float __z)
|
|
{ return __builtin_casinf(__z); }
|
|
|
|
inline __complex__ double
|
|
__complex_asin(__complex__ double __z)
|
|
{ return __builtin_casin(__z); }
|
|
|
|
inline __complex__ long double
|
|
__complex_asin(const __complex__ long double& __z)
|
|
{ return __builtin_casinl(__z); }
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
asin(const std::complex<_Tp>& __z)
|
|
{ return __complex_asin(__z.__rep()); }
|
|
#else
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
asin(const std::complex<_Tp>& __z)
|
|
{ return __complex_asin(__z); }
|
|
#endif
|
|
|
|
/// @brief atan(__z) [8.1.4].
|
|
// Effects: Behaves the same as C99 function catan, defined
|
|
// in subclause 7.3.5.3.
|
|
template<typename _Tp>
|
|
std::complex<_Tp>
|
|
__complex_atan(const std::complex<_Tp>& __z)
|
|
{
|
|
const _Tp __r2 = __z.real() * __z.real();
|
|
const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
|
|
|
|
_Tp __num = __z.imag() + _Tp(1.0);
|
|
_Tp __den = __z.imag() - _Tp(1.0);
|
|
|
|
__num = __r2 + __num * __num;
|
|
__den = __r2 + __den * __den;
|
|
|
|
return std::complex<_Tp>(_Tp(0.5) * atan2(_Tp(2.0) * __z.real(), __x),
|
|
_Tp(0.25) * log(__num / __den));
|
|
}
|
|
|
|
#if _GLIBCXX_USE_C99_COMPLEX_TR1
|
|
inline __complex__ float
|
|
__complex_atan(__complex__ float __z)
|
|
{ return __builtin_catanf(__z); }
|
|
|
|
inline __complex__ double
|
|
__complex_atan(__complex__ double __z)
|
|
{ return __builtin_catan(__z); }
|
|
|
|
inline __complex__ long double
|
|
__complex_atan(const __complex__ long double& __z)
|
|
{ return __builtin_catanl(__z); }
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
atan(const std::complex<_Tp>& __z)
|
|
{ return __complex_atan(__z.__rep()); }
|
|
#else
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
atan(const std::complex<_Tp>& __z)
|
|
{ return __complex_atan(__z); }
|
|
#endif
|
|
|
|
/// @brief acosh(__z) [8.1.5].
|
|
// Effects: Behaves the same as C99 function cacosh, defined
|
|
// in subclause 7.3.6.1.
|
|
template<typename _Tp>
|
|
std::complex<_Tp>
|
|
__complex_acosh(const std::complex<_Tp>& __z)
|
|
{
|
|
std::complex<_Tp> __t((__z.real() - __z.imag())
|
|
* (__z.real() + __z.imag()) - _Tp(1.0),
|
|
_Tp(2.0) * __z.real() * __z.imag());
|
|
__t = std::sqrt(__t);
|
|
|
|
return std::log(__t + __z);
|
|
}
|
|
|
|
#if _GLIBCXX_USE_C99_COMPLEX_TR1
|
|
inline __complex__ float
|
|
__complex_acosh(__complex__ float __z)
|
|
{ return __builtin_cacoshf(__z); }
|
|
|
|
inline __complex__ double
|
|
__complex_acosh(__complex__ double __z)
|
|
{ return __builtin_cacosh(__z); }
|
|
|
|
inline __complex__ long double
|
|
__complex_acosh(const __complex__ long double& __z)
|
|
{ return __builtin_cacoshl(__z); }
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
acosh(const std::complex<_Tp>& __z)
|
|
{ return __complex_acosh(__z.__rep()); }
|
|
#else
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
acosh(const std::complex<_Tp>& __z)
|
|
{ return __complex_acosh(__z); }
|
|
#endif
|
|
|
|
/// @brief asinh(__z) [8.1.6].
|
|
// Effects: Behaves the same as C99 function casin, defined
|
|
// in subclause 7.3.6.2.
|
|
template<typename _Tp>
|
|
std::complex<_Tp>
|
|
__complex_asinh(const std::complex<_Tp>& __z)
|
|
{
|
|
std::complex<_Tp> __t((__z.real() - __z.imag())
|
|
* (__z.real() + __z.imag()) + _Tp(1.0),
|
|
_Tp(2.0) * __z.real() * __z.imag());
|
|
__t = std::sqrt(__t);
|
|
|
|
return std::log(__t + __z);
|
|
}
|
|
|
|
#if _GLIBCXX_USE_C99_COMPLEX_TR1
|
|
inline __complex__ float
|
|
__complex_asinh(__complex__ float __z)
|
|
{ return __builtin_casinhf(__z); }
|
|
|
|
inline __complex__ double
|
|
__complex_asinh(__complex__ double __z)
|
|
{ return __builtin_casinh(__z); }
|
|
|
|
inline __complex__ long double
|
|
__complex_asinh(const __complex__ long double& __z)
|
|
{ return __builtin_casinhl(__z); }
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
asinh(const std::complex<_Tp>& __z)
|
|
{ return __complex_asinh(__z.__rep()); }
|
|
#else
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
asinh(const std::complex<_Tp>& __z)
|
|
{ return __complex_asinh(__z); }
|
|
#endif
|
|
|
|
/// @brief atanh(__z) [8.1.7].
|
|
// Effects: Behaves the same as C99 function catanh, defined
|
|
// in subclause 7.3.6.3.
|
|
template<typename _Tp>
|
|
std::complex<_Tp>
|
|
__complex_atanh(const std::complex<_Tp>& __z)
|
|
{
|
|
const _Tp __i2 = __z.imag() * __z.imag();
|
|
const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
|
|
|
|
_Tp __num = _Tp(1.0) + __z.real();
|
|
_Tp __den = _Tp(1.0) - __z.real();
|
|
|
|
__num = __i2 + __num * __num;
|
|
__den = __i2 + __den * __den;
|
|
|
|
return std::complex<_Tp>(_Tp(0.25) * (log(__num) - log(__den)),
|
|
_Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
|
|
}
|
|
|
|
#if _GLIBCXX_USE_C99_COMPLEX_TR1
|
|
inline __complex__ float
|
|
__complex_atanh(__complex__ float __z)
|
|
{ return __builtin_catanhf(__z); }
|
|
|
|
inline __complex__ double
|
|
__complex_atanh(__complex__ double __z)
|
|
{ return __builtin_catanh(__z); }
|
|
|
|
inline __complex__ long double
|
|
__complex_atanh(const __complex__ long double& __z)
|
|
{ return __builtin_catanhl(__z); }
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
atanh(const std::complex<_Tp>& __z)
|
|
{ return __complex_atanh(__z.__rep()); }
|
|
#else
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
atanh(const std::complex<_Tp>& __z)
|
|
{ return __complex_atanh(__z); }
|
|
#endif
|
|
|
|
/// @brief fabs(__z) [8.1.8].
|
|
// Effects: Behaves the same as C99 function cabs, defined
|
|
// in subclause 7.3.8.1.
|
|
template<typename _Tp>
|
|
inline std::complex<_Tp>
|
|
fabs(const std::complex<_Tp>& __z)
|
|
{ return std::abs(__z); }
|
|
|
|
|
|
/// @brief Additional overloads [8.1.9].
|
|
//
|
|
|
|
// See common.h for the primary template.
|
|
template<typename _Tp, typename _Up>
|
|
struct __promote_2<std::complex<_Tp>, _Up>
|
|
{
|
|
public:
|
|
typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
|
|
};
|
|
|
|
template<typename _Tp, typename _Up>
|
|
struct __promote_2<_Tp, std::complex<_Up> >
|
|
{
|
|
public:
|
|
typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
|
|
};
|
|
|
|
template<typename _Tp, typename _Up>
|
|
struct __promote_2<std::complex<_Tp>, std::complex<_Up> >
|
|
{
|
|
public:
|
|
typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type;
|
|
};
|
|
|
|
|
|
using std::arg;
|
|
|
|
template<typename _Tp>
|
|
inline typename __promote<_Tp>::__type
|
|
arg(_Tp __x)
|
|
{
|
|
typedef typename __promote<_Tp>::__type __type;
|
|
return std::arg(std::complex<__type>(__x));
|
|
}
|
|
|
|
using std::conj;
|
|
|
|
template<typename _Tp>
|
|
inline std::complex<typename __promote<_Tp>::__type>
|
|
conj(_Tp __x)
|
|
{ return __x; }
|
|
|
|
using std::imag;
|
|
|
|
template<typename _Tp>
|
|
inline typename __promote<_Tp>::__type
|
|
imag(_Tp)
|
|
{ return _Tp(); }
|
|
|
|
using std::norm;
|
|
|
|
template<typename _Tp>
|
|
inline typename __promote<_Tp>::__type
|
|
norm(_Tp __x)
|
|
{
|
|
typedef typename __promote<_Tp>::__type __type;
|
|
return __type(__x) * __type(__x);
|
|
}
|
|
|
|
using std::polar;
|
|
|
|
template<typename _Tp, typename _Up>
|
|
inline std::complex<typename __promote_2<_Tp, _Up>::__type>
|
|
polar(const _Tp& __rho, const _Up& __theta)
|
|
{
|
|
typedef typename __promote_2<_Tp, _Up>::__type __type;
|
|
return std::polar(__type(__rho), __type(__theta));
|
|
}
|
|
|
|
using std::pow;
|
|
|
|
template<typename _Tp, typename _Up>
|
|
inline std::complex<typename __promote_2<_Tp, _Up>::__type>
|
|
pow(const std::complex<_Tp>& __x, const _Up& __y)
|
|
{
|
|
typedef typename __promote_2<_Tp, _Up>::__type __type;
|
|
return std::pow(std::complex<__type>(__x), __type(__y));
|
|
}
|
|
|
|
template<typename _Tp, typename _Up>
|
|
inline std::complex<typename __promote_2<_Tp, _Up>::__type>
|
|
pow(const _Tp& __x, const std::complex<_Up>& __y)
|
|
{
|
|
typedef typename __promote_2<_Tp, _Up>::__type __type;
|
|
return std::pow(__type(__x), std::complex<__type>(__y));
|
|
}
|
|
|
|
template<typename _Tp, typename _Up>
|
|
inline std::complex<typename __promote_2<_Tp, _Up>::__type>
|
|
pow(const std::complex<_Tp>& __x, const std::complex<_Up>& __y)
|
|
{
|
|
typedef typename __promote_2<_Tp, _Up>::__type __type;
|
|
return std::pow(std::complex<__type>(__x),
|
|
std::complex<__type>(__y));
|
|
}
|
|
|
|
using std::real;
|
|
|
|
template<typename _Tp>
|
|
inline typename __promote<_Tp>::__type
|
|
real(_Tp __x)
|
|
{ return __x; }
|
|
|
|
_GLIBCXX_END_NAMESPACE
|
|
}
|
|
|
|
#endif
|