36#ifndef _GLIBCXX_COMPLEX
37#define _GLIBCXX_COMPLEX 1
40#pragma GCC system_header
43#pragma GCC diagnostic push
44#pragma GCC diagnostic ignored "-Wc++11-extensions"
56#pragma clang diagnostic push
57#pragma clang diagnostic ignored "-Wc99-extensions"
60#define __glibcxx_want_constexpr_complex
61#define __glibcxx_want_complex_udls
62#define __glibcxx_want_tuple_like
65#if __glibcxx_tuple_like >= 202311
70namespace std _GLIBCXX_VISIBILITY(default)
72_GLIBCXX_BEGIN_NAMESPACE_VERSION
83 template<
typename _Tp>
class complex;
84 template<>
class complex<float>;
85 template<>
class complex<double>;
86 template<>
class complex<long double>;
96 template<
typename _Tp>
132#if __glibcxx_tuple_like >= 202311L
133 template<
typename _Tp>
136 template<
typename _Tp>
138 {
using type = _Tp; };
139 template<
typename _Tp>
140 struct tuple_element<1, complex<_Tp>>
141 {
using type = _Tp; };
142 template<
typename _Tp>
143 inline constexpr bool __is_tuple_like_v<complex<_Tp>> =
true;
155 template<
typename _Tp>
164 _GLIBCXX_CONSTEXPR
complex(
const _Tp& __r = _Tp(),
const _Tp& __i = _Tp())
165 : _M_real(__r), _M_imag(__i) { }
168#if __cplusplus >= 201103L
173 template<
typename _Up>
174#if __cplusplus > 202002L
175 explicit(!
requires(_Up __u) { _Tp{__u}; })
178 : _M_real(_Tp(__z.real())), _M_imag(_Tp(__z.imag())) { }
180#if __cplusplus >= 201103L
183 _GLIBCXX_ABI_TAG_CXX11
185 real()
const {
return _M_real; }
187 _GLIBCXX_ABI_TAG_CXX11
189 imag()
const {
return _M_imag; }
193 real() {
return _M_real; }
197 real()
const {
return _M_real; }
201 imag() {
return _M_imag; }
205 imag()
const {
return _M_imag; }
210 _GLIBCXX20_CONSTEXPR
void
211 real(_Tp __val) { _M_real = __val; }
213 _GLIBCXX20_CONSTEXPR
void
214 imag(_Tp __val) { _M_imag = __val; }
243#if __cplusplus >= 201103L
248 template<
typename _Up>
251 template<
typename _Up>
254 template<
typename _Up>
257 template<
typename _Up>
260 template<
typename _Up>
263 _GLIBCXX_CONSTEXPR
complex __rep()
const
266#if __glibcxx_tuple_like >= 202311L
267 template<
typename _Cp>
268 [[__gnu__::__always_inline__]]
270 __get_part(
this _Cp& __z,
size_t __i)
noexcept
272 return __i == 0 ? __z._M_real : __z._M_imag;
281 template<
typename _Tp>
291 template<
typename _Tp>
301 template<
typename _Tp>
310 template<
typename _Tp>
311 template<
typename _Up>
315 _M_real = __z.real();
316 _M_imag = __z.imag();
321 template<
typename _Tp>
322 template<
typename _Up>
326 _M_real += __z.real();
327 _M_imag += __z.imag();
332 template<
typename _Tp>
333 template<
typename _Up>
337 _M_real -= __z.real();
338 _M_imag -= __z.imag();
344 template<
typename _Tp>
345 template<
typename _Up>
349 const _Tp __r = _M_real * __z.real() - _M_imag * __z.imag();
350 _M_imag = _M_real * __z.imag() + _M_imag * __z.real();
357 template<
typename _Tp>
358 template<
typename _Up>
362 const _Tp __r = _M_real * __z.real() + _M_imag * __z.imag();
364 _M_imag = (_M_imag * __z.real() - _M_real * __z.imag()) / __n;
372 template<
typename _Tp>
381 template<
typename _Tp>
382 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
390 template<
typename _Tp>
391 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
402 template<
typename _Tp>
403 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
411 template<
typename _Tp>
412 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
420 template<
typename _Tp>
421 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
432 template<
typename _Tp>
433 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
441 template<
typename _Tp>
442 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
450 template<
typename _Tp>
451 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
462 template<
typename _Tp>
463 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
471 template<
typename _Tp>
472 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
480 template<
typename _Tp>
481 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
491 template<
typename _Tp>
492 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
497 template<
typename _Tp>
498 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
504 template<
typename _Tp>
505 inline _GLIBCXX_CONSTEXPR
bool
507 {
return __x.real() == __y.real() && __x.imag() == __y.imag(); }
509 template<
typename _Tp>
510 inline _GLIBCXX_CONSTEXPR
bool
512 {
return __x.real() == __y && __x.imag() == _Tp(); }
514#if !(__cpp_impl_three_way_comparison >= 201907L)
515 template<
typename _Tp>
516 inline _GLIBCXX_CONSTEXPR
bool
517 operator==(
const _Tp& __x,
const complex<_Tp>& __y)
518 {
return __x == __y.real() && _Tp() == __y.imag(); }
523 template<
typename _Tp>
524 inline _GLIBCXX_CONSTEXPR
bool
526 {
return __x.real() != __y.real() || __x.imag() != __y.imag(); }
528 template<
typename _Tp>
529 inline _GLIBCXX_CONSTEXPR
bool
531 {
return __x.real() != __y || __x.imag() != _Tp(); }
533 template<
typename _Tp>
534 inline _GLIBCXX_CONSTEXPR
bool
536 {
return __x != __y.real() || _Tp() != __y.imag(); }
541 template<
typename _Tp,
typename _CharT,
class _Traits>
549 if (_Traits::eq(__ch, __is.
widen(
'(')))
552 if (__is >> __u >> __ch)
554 const _CharT __rparen = __is.
widen(
')');
555 if (_Traits::eq(__ch, __rparen))
560 else if (_Traits::eq(__ch, __is.
widen(
',')))
563 if (__is >> __v >> __ch)
565 if (_Traits::eq(__ch, __rparen))
595 template<
typename _Tp,
typename _CharT,
class _Traits>
596 basic_ostream<_CharT, _Traits>&
597 operator<<(basic_ostream<_CharT, _Traits>& __os,
const complex<_Tp>& __x)
599 basic_ostringstream<_CharT, _Traits> __s;
600 __s.
flags(__os.flags());
601 __s.imbue(__os.getloc());
602 __s.precision(__os.precision());
603 __s <<
'(' << __x.real() <<
',' << __x.imag() <<
')';
604 return __os << __s.str();
608#if __cplusplus >= 201103L
609 template<
typename _Tp>
612 {
return __z.real(); }
614 template<
typename _Tp>
617 {
return __z.imag(); }
619 template<
typename _Tp>
622 {
return __z.real(); }
624 template<
typename _Tp>
627 {
return __z.real(); }
629 template<
typename _Tp>
632 {
return __z.imag(); }
634 template<
typename _Tp>
637 {
return __z.imag(); }
640#if __glibcxx_tuple_like >= 202311L
641 template<
size_t _Int,
typename _Tp>
642 [[nodiscard,__gnu__::__always_inline__]]
646 static_assert(_Int < 2);
647 return __z.__get_part(_Int);
650 template<
size_t _Int,
typename _Tp>
651 [[nodiscard,__gnu__::__always_inline__]]
655 static_assert(_Int < 2);
659 template<
size_t _Int,
typename _Tp>
660 [[nodiscard,__gnu__::__always_inline__]]
664 static_assert(_Int < 2);
665 return __z.__get_part(_Int);
668 template<
size_t _Int,
typename _Tp>
669 [[nodiscard,__gnu__::__always_inline__]]
670 constexpr const _Tp&&
673 static_assert(_Int < 2);
678#if _GLIBCXX_USE_C99_COMPLEX
679#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
681 __complex_abs(__complex__ _Float16 __z)
682 {
return _Float16(__builtin_cabsf(__z)); }
685 __complex_arg(__complex__ _Float16 __z)
686 {
return _Float16(__builtin_cargf(__z)); }
688 inline __complex__ _Float16
689 __complex_cos(__complex__ _Float16 __z)
690 {
return static_cast<__complex__ _Float16
>(__builtin_ccosf(__z)); }
692 inline __complex__ _Float16
693 __complex_cosh(__complex__ _Float16 __z)
694 {
return static_cast<__complex__ _Float16
>(__builtin_ccoshf(__z)); }
696 inline __complex__ _Float16
697 __complex_exp(__complex__ _Float16 __z)
698 {
return static_cast<__complex__ _Float16
>(__builtin_cexpf(__z)); }
700 inline __complex__ _Float16
701 __complex_log(__complex__ _Float16 __z)
702 {
return static_cast<__complex__ _Float16
>(__builtin_clogf(__z)); }
704 inline __complex__ _Float16
705 __complex_sin(__complex__ _Float16 __z)
706 {
return static_cast<__complex__ _Float16
>(__builtin_csinf(__z)); }
708 inline __complex__ _Float16
709 __complex_sinh(__complex__ _Float16 __z)
710 {
return static_cast<__complex__ _Float16
>(__builtin_csinhf(__z)); }
712 inline __complex__ _Float16
713 __complex_sqrt(__complex__ _Float16 __z)
714 {
return static_cast<__complex__ _Float16
>(__builtin_csqrtf(__z)); }
716 inline __complex__ _Float16
717 __complex_tan(__complex__ _Float16 __z)
718 {
return static_cast<__complex__ _Float16
>(__builtin_ctanf(__z)); }
720 inline __complex__ _Float16
721 __complex_tanh(__complex__ _Float16 __z)
722 {
return static_cast<__complex__ _Float16
>(__builtin_ctanhf(__z)); }
724 inline __complex__ _Float16
725 __complex_pow(__complex__ _Float16 __x, __complex__ _Float16 __y)
726 {
return static_cast<__complex__ _Float16
>(__builtin_cpowf(__x, __y)); }
729#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
731 __complex_abs(__complex__ _Float32 __z) {
return __builtin_cabsf(__z); }
734 __complex_arg(__complex__ _Float32 __z) {
return __builtin_cargf(__z); }
736 inline __complex__ _Float32
737 __complex_cos(__complex__ _Float32 __z) {
return __builtin_ccosf(__z); }
739 inline __complex__ _Float32
740 __complex_cosh(__complex__ _Float32 __z) {
return __builtin_ccoshf(__z); }
742 inline __complex__ _Float32
743 __complex_exp(__complex__ _Float32 __z) {
return __builtin_cexpf(__z); }
745 inline __complex__ _Float32
746 __complex_log(__complex__ _Float32 __z) {
return __builtin_clogf(__z); }
748 inline __complex__ _Float32
749 __complex_sin(__complex__ _Float32 __z) {
return __builtin_csinf(__z); }
751 inline __complex__ _Float32
752 __complex_sinh(__complex__ _Float32 __z) {
return __builtin_csinhf(__z); }
754 inline __complex__ _Float32
755 __complex_sqrt(__complex__ _Float32 __z) {
return __builtin_csqrtf(__z); }
757 inline __complex__ _Float32
758 __complex_tan(__complex__ _Float32 __z) {
return __builtin_ctanf(__z); }
760 inline __complex__ _Float32
761 __complex_tanh(__complex__ _Float32 __z) {
return __builtin_ctanhf(__z); }
763 inline __complex__ _Float32
764 __complex_pow(__complex__ _Float32 __x, __complex__ _Float32 __y)
765 {
return __builtin_cpowf(__x, __y); }
768#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
770 __complex_abs(__complex__ _Float64 __z) {
return __builtin_cabs(__z); }
773 __complex_arg(__complex__ _Float64 __z) {
return __builtin_carg(__z); }
775 inline __complex__ _Float64
776 __complex_cos(__complex__ _Float64 __z) {
return __builtin_ccos(__z); }
778 inline __complex__ _Float64
779 __complex_cosh(__complex__ _Float64 __z) {
return __builtin_ccosh(__z); }
781 inline __complex__ _Float64
782 __complex_exp(__complex__ _Float64 __z) {
return __builtin_cexp(__z); }
784 inline __complex__ _Float64
785 __complex_log(__complex__ _Float64 __z) {
return __builtin_clog(__z); }
787 inline __complex__ _Float64
788 __complex_sin(__complex__ _Float64 __z) {
return __builtin_csin(__z); }
790 inline __complex__ _Float64
791 __complex_sinh(__complex__ _Float64 __z) {
return __builtin_csinh(__z); }
793 inline __complex__ _Float64
794 __complex_sqrt(__complex__ _Float64 __z) {
return __builtin_csqrt(__z); }
796 inline __complex__ _Float64
797 __complex_tan(__complex__ _Float64 __z) {
return __builtin_ctan(__z); }
799 inline __complex__ _Float64
800 __complex_tanh(__complex__ _Float64 __z) {
return __builtin_ctanh(__z); }
802 inline __complex__ _Float64
803 __complex_pow(__complex__ _Float64 __x, __complex__ _Float64 __y)
804 {
return __builtin_cpow(__x, __y); }
807#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
809 __complex_abs(__complex__ _Float128 __z) {
return __builtin_cabsl(__z); }
812 __complex_arg(__complex__ _Float128 __z) {
return __builtin_cargl(__z); }
814 inline __complex__ _Float128
815 __complex_cos(__complex__ _Float128 __z) {
return __builtin_ccosl(__z); }
817 inline __complex__ _Float128
818 __complex_cosh(__complex__ _Float128 __z) {
return __builtin_ccoshl(__z); }
820 inline __complex__ _Float128
821 __complex_exp(__complex__ _Float128 __z) {
return __builtin_cexpl(__z); }
823 inline __complex__ _Float128
824 __complex_log(__complex__ _Float128 __z) {
return __builtin_clogl(__z); }
826 inline __complex__ _Float128
827 __complex_sin(__complex__ _Float128 __z) {
return __builtin_csinl(__z); }
829 inline __complex__ _Float128
830 __complex_sinh(__complex__ _Float128 __z) {
return __builtin_csinhl(__z); }
832 inline __complex__ _Float128
833 __complex_sqrt(__complex__ _Float128 __z) {
return __builtin_csqrtl(__z); }
835 inline __complex__ _Float128
836 __complex_tan(__complex__ _Float128 __z) {
return __builtin_ctanl(__z); }
838 inline __complex__ _Float128
839 __complex_tanh(__complex__ _Float128 __z) {
return __builtin_ctanhl(__z); }
841 inline __complex__ _Float128
842 __complex_pow(__complex__ _Float128 __x, __complex__ _Float128 __y)
843 {
return __builtin_cpowl(__x, __y); }
844#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
846 __complex_abs(__complex__ _Float128 __z) {
return __builtin_cabsf128(__z); }
849 __complex_arg(__complex__ _Float128 __z) {
return __builtin_cargf128(__z); }
851 inline __complex__ _Float128
852 __complex_cos(__complex__ _Float128 __z) {
return __builtin_ccosf128(__z); }
854 inline __complex__ _Float128
855 __complex_cosh(__complex__ _Float128 __z) {
return __builtin_ccoshf128(__z); }
857 inline __complex__ _Float128
858 __complex_exp(__complex__ _Float128 __z) {
return __builtin_cexpf128(__z); }
860 inline __complex__ _Float128
861 __complex_log(__complex__ _Float128 __z) {
return __builtin_clogf128(__z); }
863 inline __complex__ _Float128
864 __complex_sin(__complex__ _Float128 __z) {
return __builtin_csinf128(__z); }
866 inline __complex__ _Float128
867 __complex_sinh(__complex__ _Float128 __z) {
return __builtin_csinhf128(__z); }
869 inline __complex__ _Float128
870 __complex_sqrt(__complex__ _Float128 __z) {
return __builtin_csqrtf128(__z); }
872 inline __complex__ _Float128
873 __complex_tan(__complex__ _Float128 __z) {
return __builtin_ctanf128(__z); }
875 inline __complex__ _Float128
876 __complex_tanh(__complex__ _Float128 __z) {
return __builtin_ctanhf128(__z); }
878 inline __complex__ _Float128
879 __complex_pow(__complex__ _Float128 __x, __complex__ _Float128 __y)
880 {
return __builtin_cpowf128(__x, __y); }
883#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
884 inline __gnu_cxx::__bfloat16_t
885 __complex_abs(__complex__
decltype(0.0bf16) __z)
886 {
return __gnu_cxx::__bfloat16_t(__builtin_cabsf(__z)); }
888 inline __gnu_cxx::__bfloat16_t
889 __complex_arg(__complex__
decltype(0.0bf16) __z)
890 {
return __gnu_cxx::__bfloat16_t(__builtin_cargf(__z)); }
892 inline __complex__
decltype(0.0bf16)
893 __complex_cos(__complex__
decltype(0.0bf16) __z)
894 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_ccosf(__z)); }
896 inline __complex__
decltype(0.0bf16)
897 __complex_cosh(__complex__
decltype(0.0bf16) __z)
898 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_ccoshf(__z)); }
900 inline __complex__
decltype(0.0bf16)
901 __complex_exp(__complex__
decltype(0.0bf16) __z)
902 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_cexpf(__z)); }
904 inline __complex__
decltype(0.0bf16)
905 __complex_log(__complex__
decltype(0.0bf16) __z)
906 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_clogf(__z)); }
908 inline __complex__
decltype(0.0bf16)
909 __complex_sin(__complex__
decltype(0.0bf16) __z)
910 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_csinf(__z)); }
912 inline __complex__
decltype(0.0bf16)
913 __complex_sinh(__complex__
decltype(0.0bf16) __z)
914 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_csinhf(__z)); }
916 inline __complex__
decltype(0.0bf16)
917 __complex_sqrt(__complex__
decltype(0.0bf16) __z)
918 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_csqrtf(__z)); }
920 inline __complex__
decltype(0.0bf16)
921 __complex_tan(__complex__
decltype(0.0bf16) __z)
922 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_ctanf(__z)); }
924 inline __complex__
decltype(0.0bf16)
925 __complex_tanh(__complex__
decltype(0.0bf16) __z)
926 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_ctanhf(__z)); }
928 inline __complex__
decltype(0.0bf16)
929 __complex_pow(__complex__
decltype(0.0bf16) __x,
930 __complex__
decltype(0.0bf16) __y)
931 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_cpowf(__x,
937 template<
typename _Tp>
941 _Tp __x = __z.real();
942 _Tp __y = __z.imag();
948 return __s *
sqrt(__x * __x + __y * __y);
951#if _GLIBCXX_USE_C99_COMPLEX
953 __complex_abs(__complex__
float __z) {
return __builtin_cabsf(__z); }
956 __complex_abs(__complex__
double __z) {
return __builtin_cabs(__z); }
959 __complex_abs(
const __complex__
long double& __z)
960 {
return __builtin_cabsl(__z); }
962 template<
typename _Tp>
966 template<
typename _Tp>
973 template<
typename _Tp>
975 __complex_arg(
const complex<_Tp>& __z)
976 {
return atan2(__z.imag(), __z.real()); }
978#if _GLIBCXX_USE_C99_COMPLEX
980 __complex_arg(__complex__
float __z) {
return __builtin_cargf(__z); }
983 __complex_arg(__complex__
double __z) {
return __builtin_carg(__z); }
986 __complex_arg(
const __complex__
long double& __z)
987 {
return __builtin_cargl(__z); }
989 template<
typename _Tp>
993 template<
typename _Tp>
1006 template<
typename _Tp>
1007 static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(
const complex<_Tp>& __z)
1009 const _Tp __x = __z.real();
1010 const _Tp __y = __z.imag();
1011 return __x * __x + __y * __y;
1016 struct _Norm_helper<true>
1018 template<
typename _Tp>
1019 static inline _GLIBCXX20_CONSTEXPR _Tp _S_do_it(
const complex<_Tp>& __z)
1023 const _Tp __x = __z.real();
1024 const _Tp __y = __z.imag();
1025 return __x * __x + __y * __y;
1029 template<
typename _Tp>
1030 inline _GLIBCXX20_CONSTEXPR _Tp
1033 return _Norm_helper<__is_floating<_Tp>::__value
1034 && !_GLIBCXX_FAST_MATH>::_S_do_it(__z);
1037 template<
typename _Tp>
1039 polar(
const _Tp& __rho,
const _Tp& __theta)
1041 __glibcxx_assert( __rho >= _Tp(0) );
1045 template<
typename _Tp>
1046 inline _GLIBCXX20_CONSTEXPR complex<_Tp>
1053 template<
typename _Tp>
1055 __complex_cos(
const complex<_Tp>& __z)
1057 const _Tp __x = __z.real();
1058 const _Tp __y = __z.imag();
1059 return complex<_Tp>(
cos(__x) *
cosh(__y), -
sin(__x) *
sinh(__y));
1062#if _GLIBCXX_USE_C99_COMPLEX
1063 inline __complex__
float
1064 __complex_cos(__complex__
float __z) {
return __builtin_ccosf(__z); }
1066 inline __complex__
double
1067 __complex_cos(__complex__
double __z) {
return __builtin_ccos(__z); }
1069 inline __complex__
long double
1070 __complex_cos(
const __complex__
long double& __z)
1071 {
return __builtin_ccosl(__z); }
1073 template<
typename _Tp>
1077 template<
typename _Tp>
1083 template<
typename _Tp>
1085 __complex_cosh(
const complex<_Tp>& __z)
1087 const _Tp __x = __z.real();
1088 const _Tp __y = __z.imag();
1092#if _GLIBCXX_USE_C99_COMPLEX
1093 inline __complex__
float
1094 __complex_cosh(__complex__
float __z) {
return __builtin_ccoshf(__z); }
1096 inline __complex__
double
1097 __complex_cosh(__complex__
double __z) {
return __builtin_ccosh(__z); }
1099 inline __complex__
long double
1100 __complex_cosh(
const __complex__
long double& __z)
1101 {
return __builtin_ccoshl(__z); }
1103 template<
typename _Tp>
1107 template<
typename _Tp>
1113 template<
typename _Tp>
1115 __complex_exp(
const complex<_Tp>& __z)
1118#if _GLIBCXX_USE_C99_COMPLEX
1119 inline __complex__
float
1120 __complex_exp(__complex__
float __z) {
return __builtin_cexpf(__z); }
1122 inline __complex__
double
1123 __complex_exp(__complex__
double __z) {
return __builtin_cexp(__z); }
1125 inline __complex__
long double
1126 __complex_exp(
const __complex__
long double& __z)
1127 {
return __builtin_cexpl(__z); }
1129 template<
typename _Tp>
1133 template<
typename _Tp>
1140 template<
typename _Tp>
1142 __complex_log(
const complex<_Tp>& __z)
1145#if _GLIBCXX_USE_C99_COMPLEX
1146 inline __complex__
float
1147 __complex_log(__complex__
float __z) {
return __builtin_clogf(__z); }
1149 inline __complex__
double
1150 __complex_log(__complex__
double __z) {
return __builtin_clog(__z); }
1152 inline __complex__
long double
1153 __complex_log(
const __complex__
long double& __z)
1154 {
return __builtin_clogl(__z); }
1156 template<
typename _Tp>
1160 template<
typename _Tp>
1165 template<
typename _Tp>
1171 template<
typename _Tp>
1173 __complex_sin(
const complex<_Tp>& __z)
1175 const _Tp __x = __z.real();
1176 const _Tp __y = __z.imag();
1180#if _GLIBCXX_USE_C99_COMPLEX
1181 inline __complex__
float
1182 __complex_sin(__complex__
float __z) {
return __builtin_csinf(__z); }
1184 inline __complex__
double
1185 __complex_sin(__complex__
double __z) {
return __builtin_csin(__z); }
1187 inline __complex__
long double
1188 __complex_sin(
const __complex__
long double& __z)
1189 {
return __builtin_csinl(__z); }
1191 template<
typename _Tp>
1195 template<
typename _Tp>
1201 template<
typename _Tp>
1203 __complex_sinh(
const complex<_Tp>& __z)
1205 const _Tp __x = __z.real();
1206 const _Tp __y = __z.imag();
1210#if _GLIBCXX_USE_C99_COMPLEX
1211 inline __complex__
float
1212 __complex_sinh(__complex__
float __z) {
return __builtin_csinhf(__z); }
1214 inline __complex__
double
1215 __complex_sinh(__complex__
double __z) {
return __builtin_csinh(__z); }
1217 inline __complex__
long double
1218 __complex_sinh(
const __complex__
long double& __z)
1219 {
return __builtin_csinhl(__z); }
1221 template<
typename _Tp>
1225 template<
typename _Tp>
1232 template<
typename _Tp>
1234 __complex_sqrt(
const complex<_Tp>& __z)
1236 _Tp __x = __z.real();
1237 _Tp __y = __z.imag();
1241 _Tp __t =
sqrt(
abs(__y) / _Tp(2));
1242 return complex<_Tp>(__t, __y < _Tp() ? -__t : __t);
1247 _Tp __u = __t / _Tp(2);
1250 :
complex<_Tp>(
abs(__y) / __t, __y < _Tp() ? -__u : __u);
1254#if _GLIBCXX_USE_C99_COMPLEX
1255 inline __complex__
float
1256 __complex_sqrt(__complex__
float __z) {
return __builtin_csqrtf(__z); }
1258 inline __complex__
double
1259 __complex_sqrt(__complex__
double __z) {
return __builtin_csqrt(__z); }
1261 inline __complex__
long double
1262 __complex_sqrt(
const __complex__
long double& __z)
1263 {
return __builtin_csqrtl(__z); }
1265 template<
typename _Tp>
1269 template<
typename _Tp>
1276 template<
typename _Tp>
1278 __complex_tan(
const complex<_Tp>& __z)
1281#if _GLIBCXX_USE_C99_COMPLEX
1282 inline __complex__
float
1283 __complex_tan(__complex__
float __z) {
return __builtin_ctanf(__z); }
1285 inline __complex__
double
1286 __complex_tan(__complex__
double __z) {
return __builtin_ctan(__z); }
1288 inline __complex__
long double
1289 __complex_tan(
const __complex__
long double& __z)
1290 {
return __builtin_ctanl(__z); }
1292 template<
typename _Tp>
1296 template<
typename _Tp>
1304 template<
typename _Tp>
1306 __complex_tanh(
const complex<_Tp>& __z)
1309#if _GLIBCXX_USE_C99_COMPLEX
1310 inline __complex__
float
1311 __complex_tanh(__complex__
float __z) {
return __builtin_ctanhf(__z); }
1313 inline __complex__
double
1314 __complex_tanh(__complex__
double __z) {
return __builtin_ctanh(__z); }
1316 inline __complex__
long double
1317 __complex_tanh(
const __complex__
long double& __z)
1318 {
return __builtin_ctanhl(__z); }
1320 template<
typename _Tp>
1324 template<
typename _Tp>
1333 template<
typename _Tp>
1335 __complex_pow_unsigned(complex<_Tp> __x,
unsigned __n)
1337 complex<_Tp> __y = __n % 2 ? __x : complex<_Tp>(_Tp(1));
1355 template<
typename _Tp>
1360 ?
complex<_Tp>(_Tp(1)) / std::__complex_pow_unsigned(__z,
1362 : std::__complex_pow_unsigned(__z, __n);
1365 template<
typename _Tp>
1369#if ! _GLIBCXX_USE_C99_COMPLEX
1373 if (__x.imag() == _Tp() && __x.real() > _Tp())
1374 return pow(__x.real(), __y);
1380 template<
typename _Tp>
1382 __complex_pow(
const complex<_Tp>& __x,
const complex<_Tp>& __y)
1383 {
return __x == _Tp() ? _Tp() :
std::exp(__y *
std::log(__x)); }
1385#if _GLIBCXX_USE_C99_COMPLEX
1386 inline __complex__
float
1387 __complex_pow(__complex__
float __x, __complex__
float __y)
1388 {
return __builtin_cpowf(__x, __y); }
1390 inline __complex__
double
1391 __complex_pow(__complex__
double __x, __complex__
double __y)
1392 {
return __builtin_cpow(__x, __y); }
1394 inline __complex__
long double
1395 __complex_pow(
const __complex__
long double& __x,
1396 const __complex__
long double& __y)
1397 {
return __builtin_cpowl(__x, __y); }
1399 template<
typename _Tp>
1402 {
return __complex_pow(__x.__rep(), __y.__rep()); }
1404 template<
typename _Tp>
1407 {
return __complex_pow(__x, __y); }
1410 template<
typename _Tp>
1415 __y.imag() *
log(__x))
1419#if __glibcxx_tuple_like >= 202311L
1420#define _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR \
1421 template<typename _Cp> \
1422 [[__gnu__::__always_inline__]] \
1424 __get_part(this _Cp& __z, size_t __i) noexcept \
1426 return __i == 0 ? __real__ __z._M_value \
1427 : __imag__ __z._M_value; \
1430#define _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
1436 class complex<float>
1439 typedef float value_type;
1440 typedef __complex__
float _ComplexT;
1442 _GLIBCXX_CONSTEXPR
complex(_ComplexT __z) : _M_value(__z) { }
1444 _GLIBCXX_CONSTEXPR
complex(
float __r = 0.0f,
float __i = 0.0f)
1445#if __cplusplus >= 201103L
1446 : _M_value{ __r, __i } { }
1449 __real__ _M_value = __r;
1450 __imag__ _M_value = __i;
1454#if __cplusplus >= 201103L
1455 _GLIBCXX14_CONSTEXPR
complex(
const complex&) =
default;
1458#if __cplusplus > 202002L
1459 template<
typename _Up>
1460 explicit(!
requires(_Up __u) { value_type{__u}; })
1461 constexpr complex(
const complex<_Up>& __z)
1464 explicit _GLIBCXX_CONSTEXPR
complex(
const complex<double>&);
1465 explicit _GLIBCXX_CONSTEXPR
complex(
const complex<long double>&);
1468#if __cplusplus >= 201103L
1471 __attribute ((__abi_tag__ (
"cxx11")))
1473 real()
const {
return __real__ _M_value; }
1475 __attribute ((__abi_tag__ (
"cxx11")))
1477 imag()
const {
return __imag__ _M_value; }
1480 real() {
return __real__ _M_value; }
1483 real()
const {
return __real__ _M_value; }
1486 imag() {
return __imag__ _M_value; }
1489 imag()
const {
return __imag__ _M_value; }
1494 _GLIBCXX20_CONSTEXPR
void
1495 real(
float __val) { __real__ _M_value = __val; }
1497 _GLIBCXX20_CONSTEXPR
void
1498 imag(
float __val) { __imag__ _M_value = __val; }
1500 _GLIBCXX20_CONSTEXPR complex&
1507 _GLIBCXX20_CONSTEXPR complex&
1514 _GLIBCXX20_CONSTEXPR complex&
1521 _GLIBCXX20_CONSTEXPR complex&
1528 _GLIBCXX20_CONSTEXPR complex&
1537#if __cplusplus >= 201103L
1538 _GLIBCXX14_CONSTEXPR complex&
operator=(
const complex&) =
default;
1541 template<
typename _Tp>
1542 _GLIBCXX20_CONSTEXPR complex&
1545 __real__ _M_value = __z.real();
1546 __imag__ _M_value = __z.imag();
1550 template<
typename _Tp>
1551 _GLIBCXX20_CONSTEXPR complex&
1554 _M_value += __z.__rep();
1559 _GLIBCXX20_CONSTEXPR complex&
1562 _M_value -= __z.__rep();
1567 _GLIBCXX20_CONSTEXPR complex&
1570 const _ComplexT __t = __z.__rep();
1576 _GLIBCXX20_CONSTEXPR complex&
1579 const _ComplexT __t = __z.__rep();
1584 _GLIBCXX_CONSTEXPR _ComplexT __rep()
const {
return _M_value; }
1586 _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
1595 class complex<double>
1598 typedef double value_type;
1599 typedef __complex__
double _ComplexT;
1601 _GLIBCXX_CONSTEXPR
complex(_ComplexT __z) : _M_value(__z) { }
1603 _GLIBCXX_CONSTEXPR
complex(
double __r = 0.0,
double __i = 0.0)
1604#if __cplusplus >= 201103L
1605 : _M_value{ __r, __i } { }
1608 __real__ _M_value = __r;
1609 __imag__ _M_value = __i;
1613#if __cplusplus >= 201103L
1614 _GLIBCXX14_CONSTEXPR
complex(
const complex&) =
default;
1617#if __cplusplus > 202002L
1618 template<
typename _Up>
1619 explicit(!
requires(_Up __u) { value_type{__u}; })
1620 constexpr complex(
const complex<_Up>& __z)
1623 _GLIBCXX_CONSTEXPR
complex(
const complex<float>& __z)
1624 : _M_value(__z.__rep()) { }
1626 explicit _GLIBCXX_CONSTEXPR
complex(
const complex<long double>&);
1629#if __cplusplus >= 201103L
1632 __attribute ((__abi_tag__ (
"cxx11")))
1634 real()
const {
return __real__ _M_value; }
1636 __attribute ((__abi_tag__ (
"cxx11")))
1638 imag()
const {
return __imag__ _M_value; }
1641 real() {
return __real__ _M_value; }
1644 real()
const {
return __real__ _M_value; }
1647 imag() {
return __imag__ _M_value; }
1650 imag()
const {
return __imag__ _M_value; }
1655 _GLIBCXX20_CONSTEXPR
void
1656 real(
double __val) { __real__ _M_value = __val; }
1658 _GLIBCXX20_CONSTEXPR
void
1659 imag(
double __val) { __imag__ _M_value = __val; }
1661 _GLIBCXX20_CONSTEXPR complex&
1668 _GLIBCXX20_CONSTEXPR complex&
1675 _GLIBCXX20_CONSTEXPR complex&
1682 _GLIBCXX20_CONSTEXPR complex&
1689 _GLIBCXX20_CONSTEXPR complex&
1697#if __cplusplus >= 201103L
1698 _GLIBCXX14_CONSTEXPR complex&
operator=(
const complex&) =
default;
1701 template<
typename _Tp>
1702 _GLIBCXX20_CONSTEXPR complex&
1705 _M_value = __z.__rep();
1709 template<
typename _Tp>
1710 _GLIBCXX20_CONSTEXPR complex&
1713 _M_value += __z.__rep();
1717 template<
typename _Tp>
1718 _GLIBCXX20_CONSTEXPR complex&
1721 _M_value -= __z.__rep();
1725 template<
typename _Tp>
1726 _GLIBCXX20_CONSTEXPR complex&
1729 const _ComplexT __t = __z.__rep();
1734 template<
typename _Tp>
1735 _GLIBCXX20_CONSTEXPR complex&
1738 const _ComplexT __t = __z.__rep();
1743 _GLIBCXX_CONSTEXPR _ComplexT __rep()
const {
return _M_value; }
1745 _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
1754 class complex<long double>
1757 typedef long double value_type;
1758 typedef __complex__
long double _ComplexT;
1760 _GLIBCXX_CONSTEXPR
complex(_ComplexT __z) : _M_value(__z) { }
1762 _GLIBCXX_CONSTEXPR
complex(
long double __r = 0.0L,
1763 long double __i = 0.0L)
1764#if __cplusplus >= 201103L
1765 : _M_value{ __r, __i } { }
1768 __real__ _M_value = __r;
1769 __imag__ _M_value = __i;
1773#if __cplusplus >= 201103L
1774 _GLIBCXX14_CONSTEXPR
complex(
const complex&) =
default;
1777#if __cplusplus > 202002L
1778 template<
typename _Up>
1779 explicit(!
requires(_Up __u) { value_type{__u}; })
1780 constexpr complex(
const complex<_Up>& __z)
1783 _GLIBCXX_CONSTEXPR
complex(
const complex<float>& __z)
1784 : _M_value(__z.__rep()) { }
1786 _GLIBCXX_CONSTEXPR
complex(
const complex<double>& __z)
1787 : _M_value(__z.__rep()) { }
1790#if __cplusplus >= 201103L
1793 __attribute ((__abi_tag__ (
"cxx11")))
1794 constexpr long double
1795 real()
const {
return __real__ _M_value; }
1797 __attribute ((__abi_tag__ (
"cxx11")))
1798 constexpr long double
1799 imag()
const {
return __imag__ _M_value; }
1802 real() {
return __real__ _M_value; }
1805 real()
const {
return __real__ _M_value; }
1808 imag() {
return __imag__ _M_value; }
1811 imag()
const {
return __imag__ _M_value; }
1816 _GLIBCXX20_CONSTEXPR
void
1817 real(
long double __val) { __real__ _M_value = __val; }
1819 _GLIBCXX20_CONSTEXPR
void
1820 imag(
long double __val) { __imag__ _M_value = __val; }
1822 _GLIBCXX20_CONSTEXPR complex&
1829 _GLIBCXX20_CONSTEXPR complex&
1836 _GLIBCXX20_CONSTEXPR complex&
1843 _GLIBCXX20_CONSTEXPR complex&
1850 _GLIBCXX20_CONSTEXPR complex&
1858#if __cplusplus >= 201103L
1859 _GLIBCXX14_CONSTEXPR complex&
operator=(
const complex&) =
default;
1862 template<
typename _Tp>
1863 _GLIBCXX20_CONSTEXPR complex&
1866 _M_value = __z.__rep();
1870 template<
typename _Tp>
1871 _GLIBCXX20_CONSTEXPR complex&
1874 _M_value += __z.__rep();
1878 template<
typename _Tp>
1879 _GLIBCXX20_CONSTEXPR complex&
1882 _M_value -= __z.__rep();
1886 template<
typename _Tp>
1887 _GLIBCXX20_CONSTEXPR complex&
1890 const _ComplexT __t = __z.__rep();
1895 template<
typename _Tp>
1896 _GLIBCXX20_CONSTEXPR complex&
1899 const _ComplexT __t = __z.__rep();
1904 _GLIBCXX_CONSTEXPR _ComplexT __rep()
const {
return _M_value; }
1906 _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
1912#if __cplusplus > 202002L
1913 template<
typename _Tp>
1914 struct __complex_type
1917#ifdef __STDCPP_FLOAT16_T__
1919 struct __complex_type<_Float16>
1920 {
typedef __complex__ _Float16 type; };
1923#ifdef __STDCPP_FLOAT32_T__
1925 struct __complex_type<_Float32>
1926 {
typedef __complex__ _Float32 type; };
1929#ifdef __STDCPP_FLOAT64_T__
1931 struct __complex_type<_Float64>
1932 {
typedef __complex__ _Float64 type; };
1935#ifdef __STDCPP_FLOAT128_T__
1937 struct __complex_type<_Float128>
1938 {
typedef __complex__ _Float128 type; };
1941#ifdef __STDCPP_BFLOAT16_T__
1943 struct __complex_type<__gnu_cxx::__bfloat16_t>
1944 {
typedef __complex__
decltype(0.0bf16) type; };
1947 template<
typename _Tp>
1948 requires requires {
typename __complex_type<_Tp>::type; }
1953 typedef typename std::__complex_type<_Tp>::type _ComplexT;
1955 constexpr complex(_ComplexT __z) : _M_value(__z) { }
1957 constexpr complex(_Tp __r = _Tp(), _Tp __i = _Tp())
1958 : _M_value{ __r, __i } { }
1960 template<
typename _Up>
1961 explicit(!
requires(_Up __u) {
value_type{__u}; })
1966 real()
const {
return __real__ _M_value; }
1969 imag()
const {
return __imag__ _M_value; }
1972 real(_Tp __val) { __real__ _M_value = __val; }
1975 imag(_Tp __val) { __imag__ _M_value = __val; }
2017 template<
typename _Up>
2021 __real__ _M_value = __z.real();
2022 __imag__ _M_value = __z.imag();
2026 template<
typename _Up>
2030 _M_value += __z.__rep();
2038 _M_value -= __z.__rep();
2046 const _ComplexT __t = __z.__rep();
2055 const _ComplexT __t = __z.__rep();
2060 constexpr _ComplexT __rep()
const {
return _M_value; }
2062 _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
2069#undef _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
2071#if __cplusplus <= 202002L
2074 inline _GLIBCXX_CONSTEXPR
2076 : _M_value(__z.__rep()) { }
2078 inline _GLIBCXX_CONSTEXPR
2080 : _M_value(__z.__rep()) { }
2082 inline _GLIBCXX_CONSTEXPR
2084 : _M_value(__z.__rep()) { }
2090#if _GLIBCXX_EXTERN_TEMPLATE
2098#ifdef _GLIBCXX_USE_WCHAR_T
2110_GLIBCXX_END_NAMESPACE_VERSION
2113#if __cplusplus >= 201103L
2115namespace std _GLIBCXX_VISIBILITY(
default)
2117_GLIBCXX_BEGIN_NAMESPACE_VERSION
2128 template<
typename _Tp>
2133 const _Tp __pi_2 = (_Tp) 1.5707963267948966192313216916397514L;
2137#if _GLIBCXX_USE_C99_COMPLEX_ARC
2138#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2139 inline __complex__ _Float16
2140 __complex_acos(__complex__ _Float16 __z)
2141 {
return static_cast<__complex__ _Float16
>(__builtin_cacosf(__z)); }
2143 inline __complex__ _Float16
2144 __complex_asin(__complex__ _Float16 __z)
2145 {
return static_cast<__complex__ _Float16
>(__builtin_casinf(__z)); }
2147 inline __complex__ _Float16
2148 __complex_atan(__complex__ _Float16 __z)
2149 {
return static_cast<__complex__ _Float16
>(__builtin_catanf(__z)); }
2151 inline __complex__ _Float16
2152 __complex_acosh(__complex__ _Float16 __z)
2153 {
return static_cast<__complex__ _Float16
>(__builtin_cacoshf(__z)); }
2155 inline __complex__ _Float16
2156 __complex_asinh(__complex__ _Float16 __z)
2157 {
return static_cast<__complex__ _Float16
>(__builtin_casinhf(__z)); }
2159 inline __complex__ _Float16
2160 __complex_atanh(__complex__ _Float16 __z)
2161 {
return static_cast<__complex__ _Float16
>(__builtin_catanhf(__z)); }
2164#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2165 inline __complex__ _Float32
2166 __complex_acos(__complex__ _Float32 __z)
2167 {
return __builtin_cacosf(__z); }
2169 inline __complex__ _Float32
2170 __complex_asin(__complex__ _Float32 __z)
2171 {
return __builtin_casinf(__z); }
2173 inline __complex__ _Float32
2174 __complex_atan(__complex__ _Float32 __z)
2175 {
return __builtin_catanf(__z); }
2177 inline __complex__ _Float32
2178 __complex_acosh(__complex__ _Float32 __z)
2179 {
return __builtin_cacoshf(__z); }
2181 inline __complex__ _Float32
2182 __complex_asinh(__complex__ _Float32 __z)
2183 {
return __builtin_casinhf(__z); }
2185 inline __complex__ _Float32
2186 __complex_atanh(__complex__ _Float32 __z)
2187 {
return __builtin_catanhf(__z); }
2190#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
2191 inline __complex__ _Float64
2192 __complex_acos(__complex__ _Float64 __z)
2193 {
return __builtin_cacos(__z); }
2195 inline __complex__ _Float64
2196 __complex_asin(__complex__ _Float64 __z)
2197 {
return __builtin_casin(__z); }
2199 inline __complex__ _Float64
2200 __complex_atan(__complex__ _Float64 __z)
2201 {
return __builtin_catan(__z); }
2203 inline __complex__ _Float64
2204 __complex_acosh(__complex__ _Float64 __z)
2205 {
return __builtin_cacosh(__z); }
2207 inline __complex__ _Float64
2208 __complex_asinh(__complex__ _Float64 __z)
2209 {
return __builtin_casinh(__z); }
2211 inline __complex__ _Float64
2212 __complex_atanh(__complex__ _Float64 __z)
2213 {
return __builtin_catanh(__z); }
2216#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
2217 inline __complex__ _Float128
2218 __complex_acos(__complex__ _Float128 __z)
2219 {
return __builtin_cacosl(__z); }
2221 inline __complex__ _Float128
2222 __complex_asin(__complex__ _Float128 __z)
2223 {
return __builtin_casinl(__z); }
2225 inline __complex__ _Float128
2226 __complex_atan(__complex__ _Float128 __z)
2227 {
return __builtin_catanl(__z); }
2229 inline __complex__ _Float128
2230 __complex_acosh(__complex__ _Float128 __z)
2231 {
return __builtin_cacoshl(__z); }
2233 inline __complex__ _Float128
2234 __complex_asinh(__complex__ _Float128 __z)
2235 {
return __builtin_casinhl(__z); }
2237 inline __complex__ _Float128
2238 __complex_atanh(__complex__ _Float128 __z)
2239 {
return __builtin_catanhl(__z); }
2240#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
2241 inline __complex__ _Float128
2242 __complex_acos(__complex__ _Float128 __z)
2243 {
return __builtin_cacosf128(__z); }
2245 inline __complex__ _Float128
2246 __complex_asin(__complex__ _Float128 __z)
2247 {
return __builtin_casinf128(__z); }
2249 inline __complex__ _Float128
2250 __complex_atan(__complex__ _Float128 __z)
2251 {
return __builtin_catanf128(__z); }
2253 inline __complex__ _Float128
2254 __complex_acosh(__complex__ _Float128 __z)
2255 {
return __builtin_cacoshf128(__z); }
2257 inline __complex__ _Float128
2258 __complex_asinh(__complex__ _Float128 __z)
2259 {
return __builtin_casinhf128(__z); }
2261 inline __complex__ _Float128
2262 __complex_atanh(__complex__ _Float128 __z)
2263 {
return __builtin_catanhf128(__z); }
2266#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2267 inline __complex__
decltype(0.0bf16)
2268 __complex_acos(__complex__
decltype(0.0bf16) __z)
2269 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_cacosf(__z)); }
2271 inline __complex__
decltype(0.0bf16)
2272 __complex_asin(__complex__
decltype(0.0bf16) __z)
2273 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_casinf(__z)); }
2275 inline __complex__
decltype(0.0bf16)
2276 __complex_atan(__complex__
decltype(0.0bf16) __z)
2277 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_catanf(__z)); }
2279 inline __complex__
decltype(0.0bf16)
2280 __complex_acosh(__complex__
decltype(0.0bf16) __z)
2281 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_cacoshf(__z)); }
2283 inline __complex__
decltype(0.0bf16)
2284 __complex_asinh(__complex__
decltype(0.0bf16) __z)
2285 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_casinhf(__z)); }
2287 inline __complex__
decltype(0.0bf16)
2288 __complex_atanh(__complex__
decltype(0.0bf16) __z)
2289 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_catanhf(__z)); }
2293#if _GLIBCXX_USE_C99_COMPLEX_ARC
2294 inline __complex__
float
2295 __complex_acos(__complex__
float __z)
2296 {
return __builtin_cacosf(__z); }
2298 inline __complex__
double
2299 __complex_acos(__complex__
double __z)
2300 {
return __builtin_cacos(__z); }
2302 inline __complex__
long double
2303 __complex_acos(
const __complex__
long double& __z)
2304 {
return __builtin_cacosl(__z); }
2306 template<
typename _Tp>
2309 {
return __complex_acos(__z.__rep()); }
2314 template<
typename _Tp>
2317 {
return __complex_acos(__z); }
2320 template<
typename _Tp>
2325 __t = std::asinh(__t);
2329#if _GLIBCXX_USE_C99_COMPLEX_ARC
2330 inline __complex__
float
2331 __complex_asin(__complex__
float __z)
2332 {
return __builtin_casinf(__z); }
2334 inline __complex__
double
2335 __complex_asin(__complex__
double __z)
2336 {
return __builtin_casin(__z); }
2338 inline __complex__
long double
2339 __complex_asin(
const __complex__
long double& __z)
2340 {
return __builtin_casinl(__z); }
2342 template<
typename _Tp>
2345 {
return __complex_asin(__z.__rep()); }
2350 template<
typename _Tp>
2353 {
return __complex_asin(__z); }
2356 template<
typename _Tp>
2360 const _Tp __r2 = __z.real() * __z.real();
2361 const _Tp __x = _Tp(1.0) - __r2 - __z.imag() * __z.imag();
2363 _Tp __num = __z.imag() + _Tp(1.0);
2364 _Tp __den = __z.imag() - _Tp(1.0);
2366 __num = __r2 + __num * __num;
2367 __den = __r2 + __den * __den;
2370 _Tp(0.25) * log(__num / __den));
2373#if _GLIBCXX_USE_C99_COMPLEX_ARC
2374 inline __complex__
float
2375 __complex_atan(__complex__
float __z)
2376 {
return __builtin_catanf(__z); }
2378 inline __complex__
double
2379 __complex_atan(__complex__
double __z)
2380 {
return __builtin_catan(__z); }
2382 inline __complex__
long double
2383 __complex_atan(
const __complex__
long double& __z)
2384 {
return __builtin_catanl(__z); }
2386 template<
typename _Tp>
2389 {
return __complex_atan(__z.__rep()); }
2394 template<
typename _Tp>
2397 {
return __complex_atan(__z); }
2400 template<
typename _Tp>
2406 +
std::sqrt(_Tp(0.5) * (__z - _Tp(1.0))));
2409#if _GLIBCXX_USE_C99_COMPLEX_ARC
2410 inline __complex__
float
2411 __complex_acosh(__complex__
float __z)
2412 {
return __builtin_cacoshf(__z); }
2414 inline __complex__
double
2415 __complex_acosh(__complex__
double __z)
2416 {
return __builtin_cacosh(__z); }
2418 inline __complex__
long double
2419 __complex_acosh(
const __complex__
long double& __z)
2420 {
return __builtin_cacoshl(__z); }
2422 template<
typename _Tp>
2425 {
return __complex_acosh(__z.__rep()); }
2430 template<
typename _Tp>
2433 {
return __complex_acosh(__z); }
2436 template<
typename _Tp>
2441 * (__z.real() + __z.imag()) + _Tp(1.0),
2442 _Tp(2.0) * __z.real() * __z.imag());
2448#if _GLIBCXX_USE_C99_COMPLEX_ARC
2449 inline __complex__
float
2450 __complex_asinh(__complex__
float __z)
2451 {
return __builtin_casinhf(__z); }
2453 inline __complex__
double
2454 __complex_asinh(__complex__
double __z)
2455 {
return __builtin_casinh(__z); }
2457 inline __complex__
long double
2458 __complex_asinh(
const __complex__
long double& __z)
2459 {
return __builtin_casinhl(__z); }
2461 template<
typename _Tp>
2464 {
return __complex_asinh(__z.__rep()); }
2469 template<
typename _Tp>
2472 {
return __complex_asinh(__z); }
2475 template<
typename _Tp>
2479 const _Tp __i2 = __z.imag() * __z.imag();
2480 const _Tp __x = _Tp(1.0) - __i2 - __z.real() * __z.real();
2482 _Tp __num = _Tp(1.0) + __z.real();
2483 _Tp __den = _Tp(1.0) - __z.real();
2485 __num = __i2 + __num * __num;
2486 __den = __i2 + __den * __den;
2489 _Tp(0.5) * atan2(_Tp(2.0) * __z.imag(), __x));
2492#if _GLIBCXX_USE_C99_COMPLEX_ARC
2493 inline __complex__
float
2494 __complex_atanh(__complex__
float __z)
2495 {
return __builtin_catanhf(__z); }
2497 inline __complex__
double
2498 __complex_atanh(__complex__
double __z)
2499 {
return __builtin_catanh(__z); }
2501 inline __complex__
long double
2502 __complex_atanh(
const __complex__
long double& __z)
2503 {
return __builtin_catanhl(__z); }
2505 template<
typename _Tp>
2508 {
return __complex_atanh(__z.__rep()); }
2513 template<
typename _Tp>
2516 {
return __complex_atanh(__z); }
2519 template<
typename _Tp>
2520 _GLIBCXX11_DEPRECATED_SUGGEST(
"std::abs")
2530 template<
typename _Tp>
2531 inline typename __gnu_cxx::__promote<_Tp>::__type
2534 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
2535#if (_GLIBCXX11_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC)
2536 return __builtin_signbit(__type(__x))
2537 ? __type(3.1415926535897932384626433832795029L) : __type();
2543 template<
typename _Tp>
2544 _GLIBCXX_CONSTEXPR
inline typename __gnu_cxx::__promote<_Tp>::__type
2548 template<
typename _Tp>
2549 _GLIBCXX20_CONSTEXPR
inline typename __gnu_cxx::__promote<_Tp>::__type
2552 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
2553 return __type(__x) * __type(__x);
2556 template<
typename _Tp>
2557 _GLIBCXX_CONSTEXPR
inline typename __gnu_cxx::__promote<_Tp>::__type
2561 template<
typename _Tp,
typename _Up>
2565 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
2569 template<
typename _Tp,
typename _Up>
2573 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
2577 template<
typename _Tp,
typename _Up>
2581 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
2588 template<
typename _Tp>
2592 template<
typename _Tp>
2597#if _GLIBCXX_USE_C99_COMPLEX
2598 inline complex<float>
2599 __complex_proj(
const complex<float>& __z)
2600 {
return __builtin_cprojf(__z.__rep()); }
2602 inline complex<double>
2603 __complex_proj(
const complex<double>& __z)
2604 {
return __builtin_cproj(__z.__rep()); }
2606 inline complex<long double>
2607 __complex_proj(
const complex<long double>& __z)
2608 {
return __builtin_cprojl(__z.__rep()); }
2610#if __cplusplus > 202002L
2611#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2612 inline __complex__ _Float16
2613 __complex_proj(__complex__ _Float16 __z)
2614 {
return static_cast<__complex__ _Float16
>(__builtin_cprojf(__z)); }
2617#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2618 inline __complex__ _Float32
2619 __complex_proj(__complex__ _Float32 __z)
2620 {
return __builtin_cprojf(__z); }
2623#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
2624 inline __complex__ _Float64
2625 __complex_proj(__complex__ _Float64 __z)
2626 {
return __builtin_cproj(__z); }
2629#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
2630 inline __complex__ _Float128
2631 __complex_proj(__complex__ _Float128 __z)
2632 {
return __builtin_cprojl(__z); }
2633#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
2634 inline __complex__ _Float128
2635 __complex_proj(__complex__ _Float128 __z)
2636 {
return __builtin_cprojf128(__z); }
2639#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2640 inline __complex__
decltype(0.0bf16)
2641 __complex_proj(__complex__
decltype(0.0bf16) __z)
2642 {
return static_cast<__complex__ decltype(0.0bf16)
>(__builtin_cprojf(__z)); }
2645 template<
typename _Tp>
2646 requires requires {
typename __complex_type<_Tp>::type; }
2648 __complex_proj(
const complex<_Tp>& __z)
2649 {
return __complex_proj(__z.__rep()); }
2652#elif defined _GLIBCXX_USE_C99_MATH_FUNCS
2653 inline complex<float>
2654 __complex_proj(
const complex<float>& __z)
2656 if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
2657 return complex<float>(__builtin_inff(),
2658 __builtin_copysignf(0.0f, __z.imag()));
2662 inline complex<double>
2663 __complex_proj(
const complex<double>& __z)
2665 if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
2666 return complex<double>(__builtin_inf(),
2667 __builtin_copysign(0.0, __z.imag()));
2671 inline complex<long double>
2672 __complex_proj(
const complex<long double>& __z)
2674 if (__builtin_isinf(__z.real()) || __builtin_isinf(__z.imag()))
2675 return complex<long double>(__builtin_infl(),
2676 __builtin_copysignl(0.0l, __z.imag()));
2681 template<
typename _Tp>
2684 {
return __complex_proj(__z); }
2687 template<
typename _Tp>
2691 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
2695 template<
typename _Tp>
2696 inline _GLIBCXX20_CONSTEXPR
2700 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
2704#ifdef __cpp_lib_complex_udls
2706inline namespace literals {
2707inline namespace complex_literals {
2708#pragma GCC diagnostic push
2709#pragma GCC diagnostic ignored "-Wliteral-suffix"
2711 constexpr std::complex<float>
2712 operator""if(
long double __num)
2713 {
return std::complex<float>{0.0F,
static_cast<float>(__num)}; }
2715 constexpr std::complex<float>
2716 operator""if(
unsigned long long __num)
2717 {
return std::complex<float>{0.0F,
static_cast<float>(__num)}; }
2719 constexpr std::complex<double>
2720 operator""i(
long double __num)
2721 {
return std::complex<double>{0.0,
static_cast<double>(__num)}; }
2723 constexpr std::complex<double>
2724 operator""i(
unsigned long long __num)
2725 {
return std::complex<double>{0.0,
static_cast<double>(__num)}; }
2727 constexpr std::complex<long double>
2728 operator""il(
long double __num)
2729 {
return std::complex<long double>{0.0L, __num}; }
2731 constexpr std::complex<long double>
2732 operator""il(
unsigned long long __num)
2733 {
return std::complex<long double>{0.0L,
static_cast<long double>(__num)}; }
2735#pragma GCC diagnostic pop
2741_GLIBCXX_END_NAMESPACE_VERSION
2746#ifdef _GLIBCXX_CLANG
2747#pragma clang diagnostic pop
2750#pragma GCC diagnostic pop
complex< _Tp > log10(const complex< _Tp > &)
Return complex base 10 logarithm of z.
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
complex< _Tp > sin(const complex< _Tp > &)
Return complex sine of z.
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
constexpr complex< _Tp > & operator*=(const _Tp &)
Multiply this complex number by a scalar.
complex< _Tp > log(const complex< _Tp > &)
Return complex natural logarithm of z.
complex< _Tp > tan(const complex< _Tp > &)
Return complex tangent of z.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
_Tp abs(const complex< _Tp > &)
Return magnitude of z.
complex< _Tp > polar(const _Tp &, const _Tp &=_Tp(0))
Return complex with magnitude rho and angle theta.
complex< _Tp > exp(const complex< _Tp > &)
Return complex base e exponential of z.
complex< _Tp > cosh(const complex< _Tp > &)
Return complex hyperbolic cosine of z.
_Tp arg(const complex< _Tp > &)
Return phase angle of z.
constexpr complex< _Tp > & operator=(const _Tp &)
Assign a scalar to this complex number.
complex< _Tp > tanh(const complex< _Tp > &)
Return complex hyperbolic tangent of z.
constexpr complex< _Tp > conj(const complex< _Tp > &)
Return complex conjugate of z.
complex< _Tp > pow(const complex< _Tp > &, int)
Return x to the y'th power.
constexpr complex< _Tp > operator/(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x divided by y.
complex< _Tp > sinh(const complex< _Tp > &)
Return complex hyperbolic sine of z.
_Tp constexpr norm(const complex< _Tp > &)
Return z magnitude squared.
constexpr complex< _Tp > & operator/=(const _Tp &)
Divide this complex number by a scalar.
complex< _Tp > cos(const complex< _Tp > &)
Return complex cosine of z.
complex< _Tp > sqrt(const complex< _Tp > &)
Return complex square root of z.
basic_ostream< char > ostream
Base class for char output streams.
basic_istream< char > istream
Base class for char input streams.
basic_ostream< wchar_t > wostream
Base class for wchar_t output streams.
basic_istream< wchar_t > wistream
Base class for wchar_t input streams.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
ISO C++ entities toplevel namespace is std.
_Tp fabs(const std::complex< _Tp > &__z)
fabs(__z) TR1 8.1.8 [tr.c99.cmplx.fabs]
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, bitset< _Nb > &__x)
Global I/O operators for bitsets.
std::basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const bitset< _Nb > &__x)
Global I/O operators for bitsets.
_Tp value_type
Value typedef.
constexpr complex(const _Tp &__r=_Tp(), const _Tp &__i=_Tp())
Default constructor. First parameter is x, second parameter is y. Unspecified parameters default to 0...
constexpr complex(const complex< _Up > &__z)
Converting constructor.
constexpr complex< _Tp > & operator-=(const _Tp &__t)
Subtract a scalar from this complex number.
constexpr complex< _Tp > & operator+=(const _Tp &__t)
Add a scalar to this complex number.
void setstate(iostate __state)
Sets additional flags in the error state.
char_type widen(char __c) const
Widens characters.
Template class basic_istream.
__istream_type & putback(char_type __c)
Unextracting a single character.
fmtflags flags() const
Access to format flags.
static const iostate failbit
Indicates that an input operation failed to read the expected characters, or that an output operation...
Finds the size of a given tuple type.
Gives the type of the ith element of a given tuple type.