Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/numeric/valarray/atan2"

From cppreference.com
< cpp‎ | numeric‎ | valarray
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}}
{{ddcl list begin}}
+
{{dcl begin}}
{{ddcl list header | valarray}}
+
{{dcl header|valarray}}
{{ddcl list item | num=1 |
+
{{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 );
 
}}
 
}}
{{ddcl list item | num=2 |
+
{{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 );
 
}}
 
}}
{{ddcl list item | num=3 |
+
{{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 );
 
}}
 
}}
{{ddcl list end}}
+
{{dcl end}}
  
Computes the inverse tangent of {{tt|y/x}} using the signs of arguments to correctly determine quadrant.
+
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 {{tt|y}} and {{tt|x}}.
+
@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 {{tt|vx}} and each value in the numeric array {{tt|y}}.
+
@2@ Computes the inverse tangent of {{c|vx}} and each value in the numeric array {{c|y}}.
@3@ Computes the inverse tangent of {{tt|vy}} and each value in the numeric array {{tt|x}}.
+
@3@ Computes the inverse tangent of {{c|vy}} and each value in the numeric array {{c|x}}.
  
 
===Parameters===
 
===Parameters===
{{param list begin}}
+
{{par begin}}
{{param list item | x, y | numeric arrays to compute inverse tangent of}}
+
{{par|x, y|numeric arrays to compute inverse tangent of}}
{{param list item | vy, vx | values to compute inverse tangent of}}
+
{{par|vy, vx|values to compute inverse tangent of}}
{{param list end}}
+
{{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===
{{dcl list begin}}
+
{{dsc begin}}
{{dcl list template | cpp/numeric/math/dcl list atan2}}
+
{{dsc inc|cpp/numeric/valarray/dsc asin}}
{{dcl list end}}
+
{{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}}
  
[[de:cpp/numeric/valarray/atan2]]
+
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}
[[es:cpp/numeric/valarray/atan2]]
+
[[fr:cpp/numeric/valarray/atan2]]
+
[[it:cpp/numeric/valarray/atan2]]
+
[[ja:cpp/numeric/valarray/atan2]]
+
[[pt:cpp/numeric/valarray/atan2]]
+
[[ru:cpp/numeric/valarray/atan2]]
+
[[zh:cpp/numeric/valarray/atan2]]
+

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,

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

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.

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:

[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) [edit]
applies the function std::acos to each element of valarray
(function template) [edit]
applies the function std::atan to each element of valarray
(function template) [edit]
(C++11)(C++11)
arc tangent, using signs to determine quadrants
(function) [edit]
returns the phase angle
(function template) [edit]