std::atan2(std::valarray) - cppreference.com (original) (raw)

| Defined in header | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --- | | | template< class T > std::valarray<T> atan2( const std::valarray<T>& y, const std::valarray<T>& x ); | (1) | | | template< class T > std::valarray<T> atan2( const std::valarray<T>& y, const typename std::valarray<T>::value_type& vx ); | (2) | | | template< class T > std::valarray<T> atan2( const typename std::valarray<T>::value_type& vy, const std::valarray<T>& x ); | (3) | |

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().

  1. Computes the inverse tangent of vx and each value in the numeric array y.

  2. Computes the inverse tangent of vy and each value in the numeric array x.

[edit] Parameters

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

[edit] Return value

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

[edit] 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:

[edit] Example

#include #include #include #include #include   void show(char const* title, const std::valarray& 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:🔢: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 degrees{-90, -60, -45, -30, 0, 30, 45, 60, 90}; const std::valarray 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°

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 3074 C++98 T is deduced from both the scalar and the valarray for (2,3), disallowing mixed-type calls only deduce T from the valarray

[edit] See also