Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
헤더 파일에 정의됨 <cmath>
(1)
float atan2 ( float y, float x ) ;

double atan2 ( double y, double x ) ;

long double atan2 ( long double y, long double x ) ;
(C++23 이전)
/*floating-point-type*/

atan2 ( /*floating-point-type*/ y,

/*floating-point-type*/ x ) ;
(C++23 이후)
(C++26부터 constexpr)
float atan2f ( float y, float x ) ;
(2) (C++11 이후)
(C++26부터 constexpr)
long double atan2l ( long double y, long double x ) ;
(3) (C++11 이후)
(C++26부터 constexpr)
SIMD 오버로드 (C++26 이후)
헤더 파일에 정의됨 <simd>
template < class V0, class V1 >

constexpr /*math-common-simd-t*/ < V0, V1 >

atan2 ( const V0 & v_y, const V1 & v_x ) ;
(S) (C++26 이후)
추가 오버로드 (C++11 이후)
헤더 파일에 정의됨 <cmath>
template < class Integer >
double atan2 ( Integer y, Integer x ) ;
(A) (C++26부터 constexpr)
1-3) 인수의 부호를 사용하여 올바른 사분면을 결정하면서 y / x 의 아크 탄젠트를 계산합니다. 라이브러리는 매개변수의 타입으로 모든 cv-unqualified 부동 소수점 타입에 대한 std::atan2 의 오버로드를 제공합니다. (C++23 이후)
S) SIMD 오버로드는 v_y v_x 에 대해 요소별(element-wise) std::atan2 를 수행합니다.
(정의는 math-common-simd-t 참조)
(C++26부터)
A) 모든 정수 타입에 대해 추가 오버로드가 제공되며, 이들은 double 로 처리됩니다.
(since C++11)

목차

매개변수

y, x - 부동 소수점 또는 정수 값

반환값

If no errors occur, the arc tangent of y / x ( arctan(
y
x
)
) in the range [-π, +π] radians, is returned.
y 인수
반환 값
x 인수

도메인 오류가 발생하면 구현에서 정의한 값이 반환됩니다(NaN을 지원하는 경우 NaN).

언더플로우로 인해 범위 오류가 발생하면, 올바른 결과(반올림 후)가 반환됩니다.

오류 처리

오류는 math_errhandling 에 명시된 대로 보고됩니다.

x y 가 모두 0인 경우 도메인 오류가 발생할 수 있습니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,

  • x y 가 모두 0인 경우, domain error는 발생하지 않습니다 .
  • x y 가 모두 0인 경우, range error도 발생하지 않습니다.
  • y 가 0인 경우, pole error는 발생하지 않습니다.
  • y 가 ±0이고 x 가 음수 또는 -0인 경우, ±π가 반환됩니다.
  • y 가 ±0이고 x 가 양수 또는 +0인 경우, ±0이 반환됩니다.
  • y 가 ±∞이고 x 가 유한한 경우, ±π/2가 반환됩니다.
  • y 가 ±∞이고 x 가 -∞인 경우, ±3π/4가 반환됩니다.
  • y 가 ±∞이고 x 가 +∞인 경우, ±π/4가 반환됩니다.
  • x 가 ±0이고 y 가 음수인 경우, -π/2가 반환됩니다.
  • x 가 ±0이고 y 가 양수인 경우, +π/2가 반환됩니다.
  • x 가 -∞이고 y 가 유한하며 양수인 경우, +π가 반환됩니다.
  • x 가 -∞이고 y 가 유한하며 음수인 경우, -π가 반환됩니다.
  • x 가 +∞이고 y 가 유한하며 양수인 경우, +0이 반환됩니다.
  • x 가 +∞이고 y 가 유한하며 음수인 경우, -0이 반환됩니다.
  • x 또는 y 중 하나가 NaN인 경우, NaN이 반환됩니다.

참고 사항

std :: atan2 ( y, x ) 는 다음 코드와 동일합니다 std:: arg ( std:: complex < std:: common_type_t < decltype ( x ) , decltype ( y ) >> ( x, y ) ) .

POSIX는 언더플로우가 발생한 경우 y / x 값을 반환하도록 명시하며, 이를 지원하지 않을 경우 DBL_MIN , FLT_MIN , 그리고 LDBL_MIN 이하의 구현 정의 값을 반환합니다.

추가 오버로드는 반드시 (A) 와 정확히 동일하게 제공될 필요는 없습니다. 첫 번째 인수 num1 과 두 번째 인수 num2 에 대해 다음을 보장할 수 있을 만큼 충분하기만 하면 됩니다:

  • num1 또는 num2 의 타입이 long double 인 경우, std :: atan2 ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: atan2 ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    .
  • 그렇지 않고 num1 및/또는 num2 의 타입이 double 또는 정수 타입인 경우, std :: atan2 ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: atan2 ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    .
  • 그렇지 않고 num1 또는 num2 의 타입이 float 인 경우, std :: atan2 ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: atan2 ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    .
(C++23 이전)

num1 num2 이 산술 타입을 가지는 경우, std :: atan2 ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: atan2 ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
, 여기서 /*common-floating-point-type*/ num1 num2 의 타입 사이에서 가장 높은 부동소수점 변환 순위 와 가장 높은 부동소수점 변환 하위 순위 를 가지는 부동소수점 타입이며, 정수 타입의 인수는 double 과 동일한 부동소수점 변환 순위를 가진 것으로 간주됩니다.

가장 높은 순위와 하위 순위를 가지는 부동소수점 타입이 존재하지 않는 경우, 오버로드 해결 은 제공된 오버로드들 중에서 사용 가능한 후보를 결과로 내지 않습니다.

(C++23 이후)

예제

#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()
{
    // 일반적인 사용법: 두 인자의 부호가 사분면을 결정함
    print_coordinates(+1, +1); // atan2( 1,  1) =  +pi/4, 제1사분면
    print_coordinates(-1, +1); // atan2( 1, -1) = +3pi/4, 제2사분면
    print_coordinates(-1, -1); // atan2(-1, -1) = -3pi/4, 제3사분면
    print_coordinates(+1, -1); // atan2(-1,  1) =  -pi/4, 제4사분면
    // 특수 값들
    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';
}

출력:

(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

참고 항목

(C++11) (C++11)
아크 사인을 계산함 ( arcsin(x) )
(함수)
(C++11) (C++11)
아크 코사인을 계산함 ( arccos(x) )
(함수)
(C++11) (C++11)
아크 탄젠트를 계산함 ( arctan(x) )
(함수)
위상각을 반환함
(함수 템플릿)
함수 std::atan2 를 valarray와 값에 적용함
(함수 템플릿)
C 문서 for atan2