Namensräume
Varianten
Aktionen

std::atan2, std::atan2f, std::atan2l

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
float       atan2 ( float y, float x );

double      atan2 ( double y, double x );

long double atan2 ( long double y, long double x );
(bis C++23)
/* Gleitkommazahl-Typ */

            atan2 ( /*Gleitkomma-Typ*/ y,

                    /*Gleitkomma-Typ*/ x );
(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>

            atan2 ( const V0& v_y, const V1& v_x );
(S) (seit C++26)
Definiert in der Header-Datei <cmath>
template< class Integer >
double      atan2 ( Integer y, Integer x );
(A) (constexpr seit C++26)
1-3) Berechnet den Arkustangens von y / x unter Verwendung der Vorzeichen der Argumente zur Bestimmung des korrekten Quadranten. Die Bibliothek stellt Überladungen von 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.
(Siehe math-common-simd-t für dessen Definition.)
(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
)
) im Bereich [-π, +π] Radiant zurückgegeben.
y-Argument
Rückgabewert
math-atan2.png
x-Argument

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

  • Wenn num1 oder num2 den Typ long double hat, dann hat std::atan2(num1, num2) die gleiche Wirkung wie std::atan2(static_cast<long double>(num1),
               static_cast<long double>(num2))
    .
  • Andernfalls, wenn num1 und/oder num2 den Typ double oder einen Ganzzahltyp hat, dann hat std::atan2(num1, num2) die gleiche Wirkung wie std::atan2(static_cast<double>(num1),
               static_cast<double>(num2))
    .
  • Andernfalls, wenn num1 oder num2 den Typ float hat, dann hat std::atan2(num1, num2) die gleiche Wirkung wie std::atan2(static_cast<float>(num1),
               static_cast<float>(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),
           static_cast</*gemeinsamer Gleitkomma-Typ*/>(num2))
, wobei /*gemeinsamer Gleitkomma-Typ*/ der Gleitkomma-Typ mit dem höchsten Gleitkomma-Konversionsrang und dem höchsten Gleitkomma-Konversions-Subrang zwischen den Typen von num1 und num2 ist. Argumente vom Ganzzahltyp werden als gleichrangig mit double betrachtet.

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) [bearbeiten]
(C++11)(C++11)
berechnet Arkuskosinus (arccos(x))
(Funktion) [bearbeiten]
(C++11)(C++11)
berechnet Arkustangens (arctan(x))
(Funktion) [bearbeiten]
gibt den Phasenwinkel zurück
(function template) [edit]
wendet die Funktion std::atan2 auf ein valarray und einen Wert an
(function template) [edit]
C-Dokumentation für atan2