45 static_assert(std::is_floating_point_v<T>);
72 constexpr operator std::complex<T>()
const
87 constexpr void real(T value)
99 constexpr void imag(T value)
148 auto const newReal =
m_real *
static_cast<T
>(other.
real()) -
m_imag *
static_cast<T
>(other.
imag());
149 auto const newImag =
m_imag *
static_cast<T
>(other.
real()) +
m_real *
static_cast<T
>(other.
imag());
321 return !(lhs == rhs);
343 template<
typename T,
typename TChar,
typename TTraits>
344 std::basic_ostream<TChar, TTraits>&
operator<<(std::basic_ostream<TChar, TTraits>& os,
Complex<T> const& x)
346 os << x.operator std::complex<T>();
351 template<
typename T,
typename TChar,
typename TTraits>
380 return std::abs(std::complex<T>(x));
387 return std::acos(std::complex<T>(x));
394 return std::acosh(std::complex<T>(x));
401 return std::arg(std::complex<T>(x));
408 return std::asin(std::complex<T>(x));
415 return std::asinh(std::complex<T>(x));
422 return std::atan(std::complex<T>(x));
429 return std::atanh(std::complex<T>(x));
436 return std::conj(std::complex<T>(x));
443 return std::cos(std::complex<T>(x));
450 return std::cosh(std::complex<T>(x));
457 return std::exp(std::complex<T>(x));
464 return std::log(std::complex<T>(x));
471 return std::log10(std::complex<T>(x));
478 return std::norm(std::complex<T>(x));
485 return std::polar(r, theta);
489 template<
typename T,
typename U>
493 auto const result = std::pow(std::complex<T>(x), std::complex<U>(y));
494 using ValueType =
typename decltype(result)::value_type;
499 template<
typename T,
typename U>
506 template<
typename T,
typename U>
516 return std::proj(std::complex<T>(x));
523 return std::sin(std::complex<T>(x));
530 return std::sinh(std::complex<T>(x));
537 return std::sqrt(std::complex<T>(x));
544 return std::tan(std::complex<T>(x));
551 return std::tanh(std::complex<T>(x));
557 using internal::Complex;
559#if ALPAKA_LANG_CUDA || ALPAKA_LANG_HIP || ALPAKA_LANG_SYCL
563 template<
typename T_MathImpl,
typename T_Arg>
564 struct Abs::Op<T_MathImpl, Complex<T_Arg>>
566 constexpr auto operator()(T_MathImpl, Complex<T_Arg>
const&
arg)
const
573 template<
typename T_MathImpl,
typename T>
576 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
579 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(-1.0)}
582 + Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)}
588 template<
typename T_MathImpl,
typename T>
591 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
599 template<
typename T_MathImpl,
typename T>
602 constexpr auto operator()(T_MathImpl, Complex<T>
const& argument)
const
604 return math::atan2(argument.imag(), argument.real());
609 template<
typename T_MathImpl,
typename T>
612 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
615 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)}
618 - Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
arg);
623 template<
typename T_MathImpl,
typename T>
626 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
634 template<
typename T_MathImpl,
typename T>
637 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
640 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(-0.5)}
642 (Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} -
arg)
643 / (Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} +
arg));
648 template<
typename T_MathImpl,
typename T>
651 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
654 return static_cast<T
>(0.5)
660 template<
typename T_MathImpl,
typename T>
663 constexpr auto operator()(T_MathImpl
const& , Complex<T>
const&
arg)
const
665 return Complex<T>{
arg.real(), -
arg.imag()};
670 template<
typename T_MathImpl,
typename T>
673 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
677 * (
math::exp(Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
arg)
678 +
math::exp(Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(-1.0)} *
arg));
683 template<
typename T_MathImpl,
typename T>
686 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
694 template<
typename T_MathImpl,
typename T>
697 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
700 auto re = T{}, im = T{};
707 template<
typename T_MathImpl,
typename T>
710 constexpr auto operator()(T_MathImpl, Complex<T>
const& argument)
const
715 + Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
math::arg(argument);
720 template<
typename T_MathImpl,
typename T>
723 constexpr auto operator()(T_MathImpl, Complex<T>
const& argument)
const
730 template<
typename T_MathImpl,
typename T>
733 constexpr auto operator()(T_MathImpl, Complex<T>
const& argument)
const
740 template<
typename T_MathImpl,
typename T,
typename U>
743 constexpr auto operator()(T_MathImpl, Complex<T>
const& base, Complex<U>
const& exponent)
const
755 template<
typename T_MathImpl,
typename T,
typename U>
758 constexpr auto operator()(T_MathImpl, Complex<T>
const& base, U
const& exponent)
const
760 return math::pow(base, Complex<U>{exponent});
765 template<
typename T_MathImpl,
typename T,
typename U>
768 constexpr auto operator()(T_MathImpl, T
const& base, Complex<U>
const& exponent)
const
770 return math::pow(Complex<T>{base}, exponent);
775 template<
typename T_MathImpl,
typename T>
778 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
785 template<
typename T_MathImpl,
typename T>
788 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
791 return (
math::exp(Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
arg)
792 -
math::exp(Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(-1.0)} *
arg))
793 / Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(2.0)};
798 template<
typename T_MathImpl,
typename T>
801 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
809 template<
typename T_MathImpl,
typename T>
814 Complex<T>
const&
arg,
815 Complex<T>& result_sin,
816 Complex<T>& result_cos)
const ->
void
824 template<
typename T_MathImpl,
typename T>
827 constexpr auto operator()(T_MathImpl, Complex<T>
const& argument)
const
831 auto const halfArg = T(0.5) *
math::arg(argument);
832 auto re = T{}, im = T{};
839 template<
typename T_MathImpl,
typename T>
842 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
846 auto const expValue =
math::exp(Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(2.0)} *
arg);
847 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} * (
static_cast<T
>(1.0) - expValue)
848 / (
static_cast<T
>(1.0) + expValue);
853 template<
typename T_MathImpl,
typename T>
856 constexpr auto operator()(T_MathImpl, Complex<T>
const&
arg)
const
constexpr Complex(T const &real=T{}, T const &imag=T{})
Constructor from the given real and imaginary parts.
Implementation of a complex number usable on host and device.
constexpr void imag(T value)
Set the imaginary part.
constexpr Complex & operator*=(Complex< U > const &other)
Multiplication assignment with a complex number.
constexpr Complex & operator-=(Complex< U > const &other)
Subtraction assignment with a complex number.
T m_real
Real and imaginary parts, storage enables array-oriented access.
constexpr T real() const
Get the real part.
constexpr Complex(Complex const &other)=default
Copy constructor.
Complex & operator=(Complex const &)=default
Assignment.
constexpr void real(T value)
Set the real part.
constexpr Complex & operator/=(Complex< U > const &other)
Division assignment with a complex number.
constexpr Complex & operator-=(T const &other)
Subtraction assignment with a real number.
constexpr Complex & operator+=(Complex< U > const &other)
Addition assignment with a complex number.
constexpr Complex(Complex< U > const &other)
Constructor from Complex of another type.
T value_type
Type of the real and imaginary parts.
constexpr Complex & operator+=(T const &other)
Addition assignment with a real number.
constexpr T imag() const
Get the imaginary part.
constexpr Complex(std::complex< T > const &other)
Constructor from std::complex.
constexpr Complex & operator*=(T const &other)
Multiplication assignment with a real number.
constexpr Complex(T const &real=T{}, T const &imag=T{})
Constructor from the given real and imaginary parts.
constexpr Complex & operator/=(T const &other)
Division assignment with a real number.
alpaka internal implementations.
constexpr Complex< T > log(Complex< T > const &x)
Natural logarithm.
constexpr Complex< T > acosh(Complex< T > const &x)
Arc hyperbolic cosine.
constexpr Complex< T > sqrt(Complex< T > const &x)
Square root.
std::basic_ostream< TChar, TTraits > & operator<<(std::basic_ostream< TChar, TTraits > &os, Complex< T > const &x)
Host-only output of a complex number.
constexpr Complex< T > tan(Complex< T > const &x)
Tangent.
constexpr Complex< T > conj(Complex< T > const &x)
Complex conjugate.
constexpr bool operator==(Complex< T > const &lhs, Complex< T > const &rhs)
Equality of two complex numbers.
constexpr Complex< T > sinh(Complex< T > const &x)
Hyperbolic sine.
constexpr T norm(Complex< T > const &x)
Squared magnitude.
constexpr Complex< T > tanh(Complex< T > const &x)
Hyperbolic tangent.
constexpr T arg(Complex< T > const &x)
Argument.
constexpr Complex< T > operator/(Complex< T > const &lhs, Complex< T > const &rhs)
Division of two complex numbers.
constexpr T abs(Complex< T > const &x)
Host-only math functions matching std::complex<T>.
constexpr Complex< T > polar(T const &r, T const &theta=T())
Get a complex number with given magnitude and phase angle.
constexpr Complex< T > atanh(Complex< T > const &x)
Arc hyperbolic tangent.
constexpr Complex< T > sin(Complex< T > const &x)
Sine.
constexpr Complex< T > proj(Complex< T > const &x)
Projection onto the Riemann sphere.
constexpr Complex< T > operator*(Complex< T > const &lhs, Complex< T > const &rhs)
Muptiplication of two complex numbers.
constexpr Complex< T > atan(Complex< T > const &x)
Arc tangent.
constexpr Complex< T > cos(Complex< T > const &x)
Cosine.
constexpr bool operator!=(Complex< T > const &lhs, Complex< T > const &rhs)
Inequality of two complex numbers.
constexpr Complex< T > asinh(Complex< T > const &x)
Arc hyperbolic sine.
constexpr Complex< T > acos(Complex< T > const &x)
Arc cosine.
constexpr Complex< T > exp(Complex< T > const &x)
Exponential.
constexpr Complex< T > operator+(Complex< T > const &val)
Host-device arithmetic operations matching std::complex<T>.
constexpr Complex< T > asin(Complex< T > const &x)
Arc sine.
constexpr Complex< T > log10(Complex< T > const &x)
Base 10 logarithm.
constexpr Complex< T > cosh(Complex< T > const &x)
Hyperbolic cosine.
std::basic_istream< TChar, TTraits > & operator>>(std::basic_istream< TChar, TTraits > &is, Complex< T > const &x)
Host-only input of a complex number.
constexpr auto pow(Complex< T > const &x, Complex< U > const &y)
Complex power of a complex number.
constexpr Complex< T > operator-(Complex< T > const &val)
Unary minus.
constexpr auto exp(auto const &arg)
constexpr auto sin(auto const &arg)
ALPAKA_FN_INLINE constexpr auto floatEqualExactNoWarning(T a, T b) -> bool
Compare two floating point numbers for exact equivalence.
constexpr auto abs(auto const &arg)
constexpr auto atan2(auto const &y, auto const &x)
constexpr auto arg(auto const &arg)
constexpr auto sincos(auto const &arg, auto &result_sin, auto &result_cos)
constexpr auto sqrt(auto const &arg)
constexpr auto cos(auto const &arg)
constexpr auto log(auto const &arg)
Computes the natural (base e) logarithm of arg.
constexpr auto pow(auto const &base, auto const &exp)
constexpr auto is_decayed_v
Provides a decaying wrapper around std::is_same. Example: is_decayed_v<volatile float,...
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Base const &base, T_Exp const &exp) const
constexpr auto operator()(T_MathImpl, T_Arg const &arg) const
constexpr auto operator()(T_MathImpl, T_Arg const &arg, T_Arg &result_sin, T_Arg &result_cos) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const
constexpr auto operator()(T_MathImpl, T_Arg const &argument) const