std::pow(std::complex)(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

✨ NAME ✨

std::pow(std::complex) β€” literally std::pow(std::complex), bestie. This is the complex-power glow-up from the C++ Standard Libary, man page section 3, and it's giving β€œraise a complex number to a power” main character energy. πŸ’…


🌸 Synopsis 🌸

Defined in header <complex>

template< class T >                                  (1) (until C++11)
std::complex<T> pow( const std::complex<T>& x, int y );

template< class T >                                  (2)
std::complex<T> pow( const std::complex<T>& x, const std::complex<T>& y );

template< class T >                                  (3)
std::complex<T> pow( const std::complex<T>& x, const T& y );

template< class T >                                  (4)
std::complex<T> pow( const T& x, const std::complex<T>& y );

Additional overloads (since C++11)

Defined in header <complex>

template< class T1, class T2 >                      (until C++23)
std::complex</* common-type */> pow( const std::complex<T1>& x, const std::complex<T2>& y );

template< class T1, class T2 >                      (since C++23)
std::complex<std::common_type_t<T1, T2>> pow( const std::complex<T1>& x, const std::complex<T2>& y );

template< class T, class NonComplex >               (A) (until C++23)
std::complex</* common-type */> pow( const std::complex<T>& x, const NonComplex& y );

template< class T, class NonComplex >               (B) (since C++23)
std::complex<std::common_type_t<T, NonComplex>> pow( const std::complex<T>& x, const NonComplex& y );

template< class T, class NonComplex >               (C) (until C++23)
std::complex</* common-type */> pow( const NonComplex& x, const std::complex<T>& y );

template< class T, class NonComplex >               (since C++23)
std::complex<std::common_type_t<T, NonComplex>> pow( const NonComplex& x, const std::complex<T>& y );

1-4) Computes complex x raised to a complex power y with a branch cut along the negative real axis for the first argument. Non-complex arguments are treated as complex numbers with positive zero imaginary component.

A-C) Additional overloads are provided (since C++11). NonComplex is not a specialization of std::complex.


πŸ’– Parameters πŸ’–

  • x β€” base. The thing getting powered up. πŸ‘‘
  • y β€” exponent. The power level. πŸ”₯

πŸŽ€ Return value πŸŽ€

1-4) If no errors occur, the complex power x^y is returned. Errors and special cases are handled as if the operation is implemented by std::exp(y * std::log(x)).

The result of std::pow(0, 0) is implementation-defined. No cap, that's just how it is. πŸ’€

A-C) Same as (2-4).


πŸ¦‹ Notes πŸ¦‹

Overload (1) was provided in C++98 to match the extra overloads (2) of std::pow. Those overloads were removed by the resolution of LWG issue 550, and overload (1) was removed by the resolution of LWG issue 844.

The additional overloads are not required to be provided exactly as (A-C). They only need to be sufficient to ensure that for their first argument base and second argument exponent:

  • If base and/or exponent has type std::complex<T>:
    • If base and/or exponent has type std::complex<long double> or long double, then std::pow(base, exponent) has the same effect as std::pow(std::complex<long double>(base), std::complex<long double>(exponent)).
    • Otherwise, if base and/or exponent has type std::complex<double>, double, or an integer type, then std::pow(base, exponent) has the same effect as std::pow(std::complex<double>(base), std::complex<double>(exponent)). (until C++23)
    • Otherwise, if base and/or exponent has type std::complex<float> or float, then std::pow(base, exponent) has the same effect as std::pow(std::complex<float>(base), std::complex<float>(exponent)).
  • If one argument has type std::complex<T1> and the other argument has type T2 or std::complex<T2>, then std::pow(base, exponent) has the same effect as std::pow(std::complex<std::common_type_t<T1, T2>>(base), std::complex<std::common_type_t<T1, T2>>(exponent)). (since C++23)
  • If std::common_type_t<T1, T2> is not well-formed, then the program is ill-formed. 🚩

✨ Example ✨

// Run this code

#include <complex>
#include <iostream>

int main()
{
    std::cout << std::fixed;

    std::complex<double> z(1.0, 2.0);
    std::cout << "(1,2)^2 = " << std::pow(z, 2) << '\n';

    std::complex<double> z2(-1.0, 0.0); // square root of -1
    std::cout << "-1^0.5 = " << std::pow(z2, 0.5) << '\n';

    std::complex<double> z3(-1.0, -0.0); // other side of the cut
    std::cout << "(-1,-0)^0.5 = " << std::pow(z3, 0.5) << '\n';

    std::complex<double> i(0.0, 1.0); // i^i = exp(-pi / 2)
    std::cout << "i^i = " << std::pow(i, i) << '\n';
}

🌈 Output: 🌈

(1,2)^2 = (-3.000000,4.000000)
-1^0.5 = (0.000000,1.000000)
(-1,-0)^0.5 = (0.000000,-1.000000)
i^i = (0.207880,0.000000)

πŸ‘‘ See also πŸ‘‘

  • sqrt(std::complex) β€” complex square root in the range of the right half-plane (function template).
  • pow, powf, powl β€” raises a number to the given power ((\(\small{x^y}\)x^y)) (function) (C++11) (C++11).
  • pow(std::valarray) β€” applies the function std::pow to two valarrays or a valarray and a value (function template).
  • C documentation for cpow β€” the C cousin has its own page, periodt.

From http://cppreference.com, version/date 2024.06.10, page std::pow(std::complex)(3) β€” that’s the footer, bestie, and we ate. Bye! πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from