std::atan2(std::valarray)(3)

NAME
std::atan2(std::valarray) - std::atan2(std::valarray)

Synopsis
   Defined in header <valarray>
   template< class T > (1)
   std::valarray<T> atan2( const std::valarray<T>& y, const std::valarray<T>& x );
   template< class T >
   std::valarray<T> atan2( const std::valarray<T>& y, (2)
   const typename std::valarray<T>::value_type& vx );
   template< class T >
   std::valarray<T> atan2( const typename std::valarray<T>::value_type& vy, (3)
   const std::valarray<T>& x );
   Computes the inverse tangent of y/x using the signs of arguments to correctly
   determine quadrant.
   1) Computes the inverse tangent of each pair of corresponding values from y and x.
   The behavior is undefined if x.size() != y.size().
   2) Computes the inverse tangent of vx and each value in the numeric array y.
   3) Computes the inverse tangent of vy and each value in the numeric array x.

Parameters
   x, y - numeric arrays to compute inverse tangent of
   vy, vx - values to compute inverse tangent of

Return value
   A numeric array containing the results of computation of inverse tangent.

Notes
   Unqualified function (atan2) is used to perform the computation. If such function is
   not available, std::atan2 is used due to argument-dependent lookup.
   The function can be implemented with the return type different from std::valarray.
   In this case, the replacement type has the following properties:
              * All const member functions of std::valarray are provided.
              * std::valarray, std::slice_array, std::gslice_array, std::mask_array and
                std::indirect_array can be constructed from the replacement type.
              * All functions accepting an argument of type const std::valarray&
                except begin() and end()
                (since C++11) should also accept the replacement type.
              * All functions accepting two arguments of type const std::valarray&
                should accept every combination of const std::valarray& and the
                replacement type.
              * The return type does not add more than two levels of template nesting
                over the most deeply-nested argument type.

Example
// Run this code
 #include <algorithm>
 #include <cmath>
 #include <iostream>
 #include <iomanip>
 #include <valarray>
 void show(char const* title, const std::valarray<double>& va) {
     std::cout << title << " ";
     std::for_each(std::begin(va), std::end(va), [](const double x) {
         std::cout << " " << std::right << std::setw(4) << x << "°";
     });
     std::cout << '\n';
 }
 const double pi = std::acos(-1.0); // C++20: std::numbers::pi
 int main()
 {
     auto degrees_to_radians = [](double const& x) { return (pi * x / 180); };
     auto radians_to_degrees = [](double const& x) { return (180 * x / pi); };
     const std::valarray<double> degrees{-90, -60, -45, -30, 0, 30, 45, 60, 90};
     const std::valarray<double> radians = degrees.apply(degrees_to_radians);
     const auto sin = std::sin(radians);
     const auto cos = std::cos(radians);
     show("(1)", std::atan2(sin, cos).apply(radians_to_degrees));
     show("(2)", std::atan2(sin/cos, 1.0).apply(radians_to_degrees));
     show("(3)", std::atan2(1.0, cos/sin).apply(radians_to_degrees));
 }

Output:
 (1) -90° -60° -45° -30° 0° 30° 45° 60° 90°
 (2) -90° -60° -45° -30° 0° 30° 45° 60° 90°
 (3) 90° 120° 135° 150° 0° 30° 45° 60° 90°
  Defect reports
   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.
      DR Applied to Behavior as published Correct behavior
                       T is deduced from both the scalar and the only deduce T from the
   LWG 3074 C++98 valarray for (2-3), disallowing valarray
                       mixed-type calls

See also
   asin(std::valarray) applies the function std::asin to each element of valarray
                       (function template)
   acos(std::valarray) applies the function std::acos to each element of valarray
                       (function template)
   atan(std::valarray) applies the function std::atan to each element of valarray
                       (function template)
   atan2
   atan2f arc tangent, using signs to determine quadrants
   atan2l (function)
   (C++11)
   (C++11)
   arg returns the phase angle
                       (function template)