Difference between revisions of "cpp/numeric/valarray/atan2"
m (r2.7.3) (Robot: Adding de, es, fr, it, ja, pt, ru, zh) |
m (→Example: '°' → "°", i.e. step back from multi-character character constant to string literal, otherwise it does not work.) |
||
(8 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{cpp/title|atan2{{small|(std::valarray)}}}} | {{cpp/title|atan2{{small|(std::valarray)}}}} | ||
{{cpp/numeric/valarray/navbar}} | {{cpp/numeric/valarray/navbar}} | ||
− | {{ | + | {{dcl begin}} |
− | {{ | + | {{dcl header|valarray}} |
− | {{ | + | {{dcl|num=1| |
template< class T > | template< class T > | ||
− | valarray<T> atan2( const valarray<T>& y, const valarray<T>& x ); | + | std::valarray<T> atan2( const std::valarray<T>& y, const std::valarray<T>& x ); |
}} | }} | ||
− | {{ | + | {{dcl|num=2| |
template< class T > | template< class T > | ||
− | valarray<T> atan2( const valarray<T>& y, const T& vx ); | + | std::valarray<T> atan2( const std::valarray<T>& y, |
+ | const typename std::valarray<T>::value_type& vx ); | ||
}} | }} | ||
− | {{ | + | {{dcl|num=3| |
template< class T > | template< class T > | ||
− | valarray<T> atan2( const T& vy, const valarray<T>& x ); | + | std::valarray<T> atan2( const typename std::valarray<T>::value_type& vy, |
+ | const std::valarray<T>& x ); | ||
}} | }} | ||
− | {{ | + | {{dcl end}} |
− | Computes the inverse tangent of {{ | + | Computes the inverse tangent of {{c|y / x}} using the signs of arguments to correctly determine quadrant. |
− | @1@ Computes the inverse tangent of each pair of corresponding values from {{ | + | @1@ Computes the inverse tangent of each pair of corresponding values from {{c|y}} and {{c|x}}. |
The behavior is undefined if {{c|1=x.size() != y.size()}}. | The behavior is undefined if {{c|1=x.size() != y.size()}}. | ||
− | @2@ Computes the inverse tangent of {{ | + | @2@ Computes the inverse tangent of {{c|vx}} and each value in the numeric array {{c|y}}. |
− | @3@ Computes the inverse tangent of {{ | + | @3@ Computes the inverse tangent of {{c|vy}} and each value in the numeric array {{c|x}}. |
===Parameters=== | ===Parameters=== | ||
− | {{ | + | {{par begin}} |
− | {{ | + | {{par|x, y|numeric arrays to compute inverse tangent of}} |
− | {{ | + | {{par|vy, vx|values to compute inverse tangent of}} |
− | {{ | + | {{par end}} |
===Return value=== | ===Return value=== | ||
Line 42: | Line 44: | ||
{{example | {{example | ||
|code= | |code= | ||
+ | #include <algorithm> | ||
+ | #include <cmath> | ||
+ | #include <iomanip> | ||
+ | #include <iostream> | ||
+ | #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= | |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 === | ||
+ | {{dr list begin}} | ||
+ | {{dr list item|wg=lwg|dr=3074|std=C++98|before={{tt|T}} is deduced from both the scalar and the {{tt|valarray}} for {{v|2,3}}, disallowing mixed-type calls |after=only deduce {{tt|T}} from the {{tt|valarray}}}} | ||
+ | {{dr list end}} | ||
===See also=== | ===See also=== | ||
− | {{ | + | {{dsc begin}} |
− | {{ | + | {{dsc inc|cpp/numeric/valarray/dsc asin}} |
− | {{ | + | {{dsc inc|cpp/numeric/valarray/dsc acos}} |
+ | {{dsc inc|cpp/numeric/valarray/dsc atan}} | ||
+ | {{dsc inc|cpp/numeric/math/dsc atan2}} | ||
+ | {{dsc inc|cpp/numeric/complex/dsc arg}} | ||
+ | {{dsc end}} | ||
− | + | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Latest revision as of 13:44, 17 October 2023
Defined in header <valarray>
|
||
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, |
(2) | |
template< class T > std::valarray<T> atan2( const typename std::valarray<T>::value_type& vy, |
(3) | |
Computes the inverse tangent of y / x using the signs of arguments to correctly determine quadrant.
The behavior is undefined if x.size() != y.size().
Contents |
[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:
- 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.
- For every function taking a const std::valarray<T>& except begin() and end()(since C++11), identical functions taking the replacement types shall be added;
- For every function taking two const std::valarray<T>& arguments, identical functions taking every combination of const std::valarray<T>& and replacement types shall be added.
- The return type does not add more than two levels of template nesting over the most deeply-nested argument type.
[edit] Example
#include <algorithm> #include <cmath> #include <iomanip> #include <iostream> #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°
[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
applies the function std::asin to each element of valarray (function template) | |
applies the function std::acos to each element of valarray (function template) | |
applies the function std::atan to each element of valarray (function template) | |
(C++11)(C++11) |
arc tangent, using signs to determine quadrants (function) |
returns the phase angle (function template) |