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から)
(constexpr C++26から)
float atan2f ( float y, float x ) ;
(2) (C++11から)
(constexpr C++26から)
long double atan2l ( long double y, long double x ) ;
(3) (C++11から)
(constexpr 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から)
ヘッダー <cmath> で定義
template < class Integer >
double atan2 ( Integer y, Integer x ) ;
(A) (constexpr C++26から)
1-3) 引数の符号を用いて正しい象限を決定し、 y / x の逆正接を計算します。 ライブラリはすべてのcv修飾されない浮動小数点型をパラメータの型とする std::atan2 のオーバーロードを提供します。 (C++23以降)
S) SIMDオーバーロードは、 v_y v_x に対して要素ごとの std::atan2 を実行します。
(定義については math-common-simd-t を参照)
(C++26以降)
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。
(since C++11)

目次

翻訳のポイント: - 「Contents」→「目次」に翻訳 - HTMLタグ、属性、リンク先は一切変更せず保持 - C++関連の用語(Parameters、Return value、Error handling、Notes、Example、See also)は原文のまま保持 - 数値、クラス名、IDなどはそのまま維持 - フォーマットと構造は完全に保持

パラメータ

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 が両方ともゼロの場合、定義域エラーが発生する可能性があります。

IEEE浮動小数点演算(IEC 60559)を実装がサポートしている場合、

  • x y がともにゼロの場合、定義域エラーは 発生しない
  • x y がともにゼロの場合、値域エラーも発生しない。
  • y がゼロの場合、極エラーは発生しない。
  • 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()
{
    // 通常の使用法: 2つの引数の符号が象限を決定する
    print_coordinates(+1, +1); // atan2( 1,  1) =  +pi/4, 第I象限
    print_coordinates(-1, +1); // atan2( 1, -1) = +3pi/4, 第II象限
    print_coordinates(-1, -1); // atan2(-1, -1) = -3pi/4, 第III象限
    print_coordinates(+1, -1); // atan2(-1,  1) =  -pi/4, 第IV象限
    // 特殊な値
    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と値に適用する
(関数テンプレート)