std::atan2, std::atan2f, std::atan2l
| Definiert in der Header-Datei <cmath> |
||
| (1) | ||
float atan2 ( float y, float x ); double atan2 ( double y, double x ); |
(bis C++23) | |
| /* Gleitkommazahl-Typ */ atan2 ( /*Gleitkomma-Typ*/ y, |
(seit C++23) (constexpr seit C++26) |
|
float atan2f( float y, float x ); |
(2) | (seit C++11) (constexpr seit C++26) |
long double atan2l( long double y, long double x ); |
(3) | (seit C++11) (constexpr seit C++26) |
| SIMD-Überladung (seit C++26) |
||
| Definiert im Header <simd> |
||
| template< class V0, class V1 > constexpr /*math-common-simd-t*/<V0, V1> |
(S) | (seit C++26) |
| Zusätzliche Überladungen (seit C++11) |
||
| Definiert in der Header-Datei <cmath> |
||
template< class Integer > double atan2 ( Integer y, Integer x ); |
(A) | (constexpr seit C++26) |
std::atan2 für alle cv-unqualifizierten Gleitkomma-Typen als Parametertypen bereit.(seit C++23)|
S) Die SIMD-Überladung führt eine elementweise
std::atan2 für v_y und v_x durch.
|
(seit C++26) |
|
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.
|
(seit C++11) |
Inhalt |
[edit] Parameter
| y, x | - | Gleitkomma- oder Ganzzahlwerte |
[edit] Rückgabewert
Wenn keine Fehler auftreten, wird der Arkustangens von y / x (arctan(| y |
| x |
Wenn ein Domänenfehler auftritt, wird ein implementierungsabhängiger Wert zurückgegeben (NaN, wo unterstützt).
Wenn ein Bereichsfehler aufgrund eines Unterlaufs auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.
[edit] Fehlerbehandlung
Fehler werden wie in math_errhandling beschrieben gemeldet.
Ein Domänenfehler kann auftreten, wenn x und y beide Null sind.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn x und y beide Null sind, tritt *kein* Domänenfehler auf.
- Wenn x und y beide Null sind, tritt auch kein Bereichsfehler auf.
- Wenn y Null ist, tritt kein Polfehler auf.
- Wenn y ±0 und x negativ oder -0 ist, wird ±π zurückgegeben.
- Wenn y ±0 und x positiv oder +0 ist, wird ±0 zurückgegeben.
- Wenn y ±∞ und x endlich ist, wird ±π/2 zurückgegeben.
- Wenn y ±∞ und x -∞ ist, wird ±3π/4 zurückgegeben.
- Wenn y ±∞ und x +∞ ist, wird ±π/4 zurückgegeben.
- Wenn x ±0 und y negativ ist, wird -π/2 zurückgegeben.
- Wenn x ±0 und y positiv ist, wird +π/2 zurückgegeben.
- Wenn x -∞ und y endlich und positiv ist, wird +π zurückgegeben.
- Wenn x -∞ und y endlich und negativ ist, wird -π zurückgegeben.
- Wenn x +∞ und y endlich und positiv ist, wird +0 zurückgegeben.
- Wenn x +∞ und y endlich und negativ ist, wird -0 zurückgegeben.
- Wenn entweder x NaN oder y NaN ist, wird NaN zurückgegeben.
[edit] Anmerkungen
std::atan2(y, x) ist äquivalent zu std::arg(std::complex<std::common_type_t<decltype(x), decltype(y)>>(x, y)).
POSIX spezifiziert, dass im Falle von Unterlauf der Wert y / x zurückgegeben wird, und wenn dies nicht unterstützt wird, ein implementierungsdefinierter Wert, der nicht größer als DBL_MIN, FLT_MIN und LDBL_MIN ist, zurückgegeben wird.
Die zusätzlichen Überladungen müssen nicht exakt wie (A) angegeben werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr erstes Argument num1 und ihr zweites Argument num2
|
(bis C++23) |
|
Wenn num1 und num2 arithmetische Typen haben, dann hat std::atan2(num1, num2) die gleiche Wirkung wie std::atan2(static_cast</*gemeinsamer Gleitkomma-Typ*/>(num1), Wenn kein solcher Gleitkommazahltyp mit dem höchsten Rang und Subrang existiert, dann führt die Überladungsauflösung nicht zu einem nutzbaren Kandidaten aus den bereitgestellten Überladungen. |
(seit C++23) |
[edit] Beispiel
#include <cmath> #include <iostream> void print_coordinates(int x, int y) { std::cout << std::showpos << "(x:" << x << ", y:" << y << ") cartesian is " << "(r:" << std::hypot(x, y) << ", phi:" << std::atan2(y, x) << ") polar\n"; } int main() { // normal usage: the signs of the two arguments determine the quadrant print_coordinates(+1, +1); // atan2( 1, 1) = +pi/4, Quad I print_coordinates(-1, +1); // atan2( 1, -1) = +3pi/4, Quad II print_coordinates(-1, -1); // atan2(-1, -1) = -3pi/4, Quad III print_coordinates(+1, -1); // atan2(-1, 1) = -pi/4, Quad IV // special values std::cout << std::noshowpos << "atan2(0, 0) = " << atan2(0, 0) << '\n' << "atan2(0,-0) = " << atan2(0, -0.0) << '\n' << "atan2(7, 0) = " << atan2(7, 0) << '\n' << "atan2(7,-0) = " << atan2(7, -0.0) << '\n'; }
Ausgabe
(x:+1, y:+1) cartesian is (r:1.41421, phi:0.785398) polar (x:-1, y:+1) cartesian is (r:1.41421, phi:2.35619) polar (x:-1, y:-1) cartesian is (r:1.41421, phi:-2.35619) polar (x:+1, y:-1) cartesian is (r:1.41421, phi:-0.785398) polar atan2(0, 0) = 0 atan2(0,-0) = 3.14159 atan2(7, 0) = 1.5708 atan2(7,-0) = 1.5708
[edit] Siehe auch
| (C++11)(C++11) |
berechnet Arkussinus (arcsin(x)) (Funktion) |
| (C++11)(C++11) |
berechnet Arkuskosinus (arccos(x)) (Funktion) |
| (C++11)(C++11) |
berechnet Arkustangens (arctan(x)) (Funktion) |
| gibt den Phasenwinkel zurück (function template) | |
| wendet die Funktion std::atan2 auf ein valarray und einen Wert an (function template) | |
| C-Dokumentation für atan2
| |