36 #ifndef _GLIBCXX_COMPLEX
37 #define _GLIBCXX_COMPLEX 1
39 #ifdef _GLIBCXX_SYSHDR
40 #pragma GCC system_header
43 #pragma GCC diagnostic push
44 #pragma GCC diagnostic ignored "-Wc++11-extensions" // extern template
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 // >= C++26
70 namespace std _GLIBCXX_VISIBILITY(default)
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
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 // >= C++26
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;
144 #endif // __glibcxx_tuple_like >= 202311
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; }
217 _GLIBCXX20_CONSTEXPR complex<_Tp>&
operator=(
const _Tp&);
221 _GLIBCXX20_CONSTEXPR complex<_Tp>&
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 // >= C++26
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>
282 _GLIBCXX20_CONSTEXPR complex<_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
525 operator!=(
const complex<_Tp>& __x,
const complex<_Tp>& __y)
526 {
return __x.real() != __y.real() || __x.imag() != __y.imag(); }
528 template<
typename _Tp>
529 inline _GLIBCXX_CONSTEXPR
bool
530 operator!=(
const complex<_Tp>& __x,
const _Tp& __y)
531 {
return __x.real() != __y || __x.imag() != _Tp(); }
533 template<
typename _Tp>
534 inline _GLIBCXX_CONSTEXPR
bool
535 operator!=(
const _Tp& __x,
const complex<_Tp>& __y)
536 {
return __x != __y.real() || _Tp() != __y.imag(); }
541 template<
typename _Tp,
typename _CharT,
class _Traits>
542 basic_istream<_CharT, _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>&
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>
611 real(
const complex<_Tp>& __z)
612 {
return __z.real(); }
614 template<
typename _Tp>
616 imag(
const complex<_Tp>& __z)
617 {
return __z.imag(); }
619 template<
typename _Tp>
621 real(complex<_Tp>& __z)
622 {
return __z.real(); }
624 template<
typename _Tp>
626 real(
const complex<_Tp>& __z)
627 {
return __z.real(); }
629 template<
typename _Tp>
631 imag(complex<_Tp>& __z)
632 {
return __z.imag(); }
634 template<
typename _Tp>
636 imag(
const complex<_Tp>& __z)
637 {
return __z.imag(); }
640 #if __glibcxx_tuple_like >= 202311L // >= C++26
641 template<
size_t _Int,
typename _Tp>
642 [[nodiscard,__gnu__::__always_inline__]]
644 get(complex<_Tp>& __z) noexcept
646 static_assert(_Int < 2);
647 return __z.__get_part(_Int);
650 template<
size_t _Int,
typename _Tp>
651 [[nodiscard,__gnu__::__always_inline__]]
653 get(complex<_Tp>&& __z) noexcept
655 static_assert(_Int < 2);
659 template<
size_t _Int,
typename _Tp>
660 [[nodiscard,__gnu__::__always_inline__]]
662 get(
const complex<_Tp>& __z) noexcept
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&&
671 get(
const complex<_Tp>&& __z) noexcept
673 static_assert(_Int < 2);
676 #endif // __glibcxx_tuple_like >= 202311
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>
939 __complex_abs(
const complex<_Tp>& __z)
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>
964 abs(
const complex<_Tp>& __z) {
return __complex_abs(__z.__rep()); }
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>
991 arg(
const complex<_Tp>& __z) {
return __complex_arg(__z.__rep()); }
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>
1075 cos(
const complex<_Tp>& __z) {
return __complex_cos(__z.__rep()); }
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>
1105 cosh(
const complex<_Tp>& __z) {
return __complex_cosh(__z.__rep()); }
1107 template<
typename _Tp>
1113 template<
typename _Tp>
1115 __complex_exp(
const complex<_Tp>& __z)
1116 {
return std::polar<_Tp>(
exp(__z.real()), __z.imag()); }
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>
1131 exp(
const complex<_Tp>& __z) {
return __complex_exp(__z.__rep()); }
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>
1158 log(
const complex<_Tp>& __z) {
return __complex_log(__z.__rep()); }
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>
1193 sin(
const complex<_Tp>& __z) {
return __complex_sin(__z.__rep()); }
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>
1223 sinh(
const complex<_Tp>& __z) {
return __complex_sinh(__z.__rep()); }
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);
1249 ? complex<_Tp>(__u, __y / __t)
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>
1267 sqrt(
const complex<_Tp>& __z) {
return __complex_sqrt(__z.__rep()); }
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>
1294 tan(
const complex<_Tp>& __z) {
return __complex_tan(__z.__rep()); }
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>
1322 tanh(
const complex<_Tp>& __z) {
return __complex_tanh(__z.__rep()); }
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);
1377 return std::polar<_Tp>(
exp(__y * __t.real()), __y * __t.imag());
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>
1401 pow(
const complex<_Tp>& __x,
const complex<_Tp>& __y)
1402 {
return __complex_pow(__x.__rep(), __y.__rep()); }
1404 template<
typename _Tp>
1407 {
return __complex_pow(__x, __y); }
1410 template<
typename _Tp>
1414 return __x > _Tp() ? std::polar<_Tp>(
pow(__x, __y.real()),
1415 __y.imag() *
log(__x))
1419 #if __glibcxx_tuple_like >= 202311L // >= C++26
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
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
1458 #if __cplusplus > 202002L
1459 template<
typename _Up>
1460 explicit(!requires(_Up __u) { value_type{__u}; })
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; }
1537 #if __cplusplus >= 201103L
1541 template<
typename _Tp>
1545 __real__ _M_value = __z.real();
1546 __imag__ _M_value = __z.imag();
1550 template<
typename _Tp>
1554 _M_value += __z.__rep();
1562 _M_value -= __z.__rep();
1570 const _ComplexT __t = __z.__rep();
1579 const _ComplexT __t = __z.__rep();
1584 _GLIBCXX_CONSTEXPR _ComplexT __rep()
const {
return _M_value; }
1586 _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
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
1617 #if __cplusplus > 202002L
1618 template<
typename _Up>
1619 explicit(!requires(_Up __u) { value_type{__u}; })
1624 : _M_value(__z.__rep()) { }
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; }
1697 #if __cplusplus >= 201103L
1701 template<
typename _Tp>
1705 _M_value = __z.__rep();
1709 template<
typename _Tp>
1713 _M_value += __z.__rep();
1717 template<
typename _Tp>
1721 _M_value -= __z.__rep();
1725 template<
typename _Tp>
1729 const _ComplexT __t = __z.__rep();
1734 template<
typename _Tp>
1738 const _ComplexT __t = __z.__rep();
1743 _GLIBCXX_CONSTEXPR _ComplexT __rep()
const {
return _M_value; }
1745 _GLIBCXX26_DECLARE_COMPLEX_TUPLE_HELPER_ACCESSOR
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
1777 #if __cplusplus > 202002L
1778 template<
typename _Up>
1779 explicit(!requires(_Up __u) { value_type{__u}; })
1784 : _M_value(__z.__rep()) { }
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; }
1858 #if __cplusplus >= 201103L
1862 template<
typename _Tp>
1866 _M_value = __z.__rep();
1870 template<
typename _Tp>
1874 _M_value += __z.__rep();
1878 template<
typename _Tp>
1882 _M_value -= __z.__rep();
1886 template<
typename _Tp>
1890 const _ComplexT __t = __z.__rep();
1895 template<
typename _Tp>
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}; })
1962 constexpr
complex(
const complex<_Up>& __z)
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
2115 namespace 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 // C++ >= 14
2706 inline namespace literals {
2707 inline namespace complex_literals {
2708 #pragma GCC diagnostic push
2709 #pragma GCC diagnostic ignored "-Wliteral-suffix"
2712 operator""if(
long double __num)
2716 operator""if(
unsigned long long __num)
2720 operator""i(
long double __num)
2724 operator""i(
unsigned long long __num)
2728 operator""il(
long double __num)
2732 operator""il(
unsigned long long __num)
2735 #pragma GCC diagnostic pop
2739 #endif // __cpp_lib_complex_udls
2741 _GLIBCXX_END_NAMESPACE_VERSION
2746 #ifdef _GLIBCXX_CLANG
2747 #pragma clang diagnostic pop
2750 #pragma GCC diagnostic pop