math_atan2

math_atan2 (사분면을 고려한 아크 탄젠트)

std::atan2는 인자의 부호를 사용해 올바른 사분면을 결정하며 y/x의 아크 탄젠트를 라디안으로 계산하는 함수예요. 결과 범위는 [-π, +π]예요.

출처: cppreference

본문

<cmath> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.

float       atan2 ( float y, float x );
double      atan2 ( double y, double x );
long double atan2 ( long double y, long double x );

(1) (until C++23)

/*floating-point-type*/
            atan2 ( /*floating-point-type*/ y,
                    /*floating-point-type*/ x );

(since C++23) (constexpr since C++26)

float       atan2f( float y, float x );

(2) (since C++11) (constexpr since C++26)

long double atan2l( long double y, long double x );

(3) (since C++11) (constexpr since C++26)

SIMD 오버로드 (since 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) (since C++26)

추가 오버로드 (since C++11): <cmath> 헤더에 정의돼요.

template< class Integer >
double      atan2 ( Integer y, Integer x );

(A) (constexpr since C++26)

  • 1-3) 인자의 부호를 사용해 올바른 사분면을 결정하며 y / x의 아크 탄젠트를 계산해요. 라이브러리는 매개변수의 타입으로 모든 cv 한정되지 않은 부동소수점 타입에 대한 std::atan2 오버로드를 제공해요. (C++23부터)
  • S) SIMD 오버로드는 v_y와 v_x에 요소별 std::atan2를 수행해요.
  • A) 모든 정수 타입에 대해 추가 오버로드가 제공되는데, double로 취급돼요.

(C++11부터)

매개변수 (Parameters)

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

반환값 (Return value)

오류가 없다면 범위 [-π, +π] 라디안의 y / x의 아크 탄젠트(arctan(y/x))를 반환해요.

도메인 오류가 발생하면 구현 정의 값을 반환해요 (NaN 지원 시 NaN).

언더플로로 인한 범위 오류가 발생하면 (반올림 후의) 올바른 결과를 반환해요.

오류 처리 (Error handling)

오류는 math_errhandling에 지정된 대로 보고돼요.

x와 y가 모두 0이면 도메인 오류가 발생할 수 있어요.

구현이 IEEE 부동소수점 연산(IEC 60559)을 지원한다면:

  • x와 y가 모두 0이면 도메인 오류가 발생하지 않아요.
  • x와 y가 모두 0이면 범위 오류도 발생하지 않아요.
  • y가 0이면 극(pole) 오류가 발생하지 않아요.
  • y가 ±0이고 x가 음수 또는 -0이면 ±π를 반환해요.
  • y가 ±0이고 x가 양수 또는 +0이면 ±0을 반환해요.
  • y가 ±∞이고 x가 유한이면 ±π/2를 반환해요.
  • y가 ±∞이고 x가 ±∞이면 ±3π/4 또는 ±π/4를 반환해요 (부호 조합에 따라).

예제 (Example)

이 코드를 실행해 봐요.

#include <cmath>
#include <iostream>

int main()
{
    std::cout << "atan2(1, 1) = " << std::atan2(1, 1) << '\n'
              << "atan2(-1, -1) = " << std::atan2(-1, -1) << '\n'
              << "atan2(0, -1) = " << std::atan2(0, -1) << '\n'
              << "atan2(-0, -1) = " << std::atan2(-0.0, -1) << '\n';
}

더 알아보기 (Learn more)

cppreference