Atan2

atan2(y, x)は、点(x, y)方向への半直線（レイ）と、x軸の正の向きとの間の角度θを返す。ただし、範囲はである
に関するのグラフ
atan2（アークタンジェント2）は、関数の一種。「2つの引数を取るarctan（アークタンジェント）」という意味である。x軸の正の向きと、点(x, y) （ただし、(0, 0)ではない）まで伸ばした半直線（レイ）との間の、ユークリッド平面上における角度として定義される。関数はもしくはの形をとり、値はラジアンで返ってくる。
関数は、プログラミング言語のFortran（IBM社が1961年に実装したFORTRAN-IV）において最初に登場した。元々は、角度θを直交座標系の(x, y)から極座標系の(r, θ)に変換する際に、正確で一意な値が返ってくることを意図して導入された。また、は複素数の偏角「位相」とも言う。を求める際にも利用される。
関数 は、の範囲で、

（ただし、r > 0）となる単一の値θを返す。
なお、arctanを使って角度θを求める際に注意すべきことであるが、が真であるからと言って、
 
であるということが常に言えるとは限らない。
これは、x > 0だった場合にのみ当てはまる。もしmath|x ATAN2(Y, X)にまで遡ることができ、現代的なプログラミング言語にも標準的な数学関数ライブラリやパッケージの形で実装されている。例を挙げると、C言語およびC++の標準ライブラリ（標準Cライブラリのmath.hにおけるatan2()関数あるいは標準C++ライブラリのcmathにおけるstd::atan2()関数）、Javaの標準ライブラリにおけるatan2-double-double-メソッド、C#/F#/VB.NETなどから利用できる.NETの基本クラスライブラリにおけるSystem.Math.Atan2()メソッド、JavaScriptの標準組み込みオブジェクトMath、Pythonのmathモジュール、RubyのMathモジュール、Goのmathパッケージ、などであるが、他にも多数の言語に実装されている。さらに、Perlを始めとするスクリプト言語にも、C言語風のatan2(y, x)関数が実装されていることが多い。
また、単に「便利だから」と言うことも存在の理由の一つである。単一引数のみを取るarctan関数(アークタンジェント関数)では正反対の方向を区別できないと言う弱点がある。例えば、x軸とベクトル(1, 1)がなす反時計回りの角度をarctan関数を使って「arctan(1/1)」として計算した場合、「π/4ラジアン（度数法で45°）」という答えが返却される。しかし、x軸とベクトル(−1, −1)の間の角度を同様に「arctan(−1/−1)」として計算してみると、期待される返却値は「−3π/4ラジアン(−135°)」または「5π/4ラジアン(225°)」であるにもかかわらず、「π/4ラジアン」が返却される。さらに、x軸とベクトル(0, y)(ただし、y ≠ 0とする)がなす角度をarctan関数で計算しようとするとarctan(y/0)の評価が必要になってしまい、返却されるのはゼロ除算のエラーとなる。
関数は2つの変数 y と xから一意なアークタンジェントの値を算出するが、そのとき両変数の正負の符号が実行結果の象限を決定するために利用される。それに基づいて「arctan(y/x)」を実行したときの結果の中から分岐先の結果を選んで返している。例を挙げると、arctan関数では同じ結果が返される「1=atan2(1, 1) = π/4」 と 「1=atan2(−1, −1) = −3π/4」では、入力値の符号を用いてどちらの解を正解と取るのかを判断している。また、例えば前述の「arctan(y/0)」を計算しようとしても、ゼロ除算のエラーの代わりに「1=atan2(1, 0) = π/2」を返却することも、同様の方法で行っている。
もちろん、上記の計算を自分で実装すれば極論atan2関数は必要ないが、その実装プログラム中のどこかでミスを犯す危険性がある。それよりも常に一意な正しい結果を返してくれるような関数が存在した方が圧倒的に便利である。そのような経緯からatan2関数が存在するのである。

**定義と計算**

**定義**
関数 atan2 は複素数 x + yi に偏角関数 arg を適用した時の主値を計算する。すなわち、 である。偏角は、2π（原点を中心としたちょうど1周の回転に対応）の整数倍を加えたものも同じ角度になるが、atan2 を一意に定義するために範囲  の主値を使用する。つまり、−π  0 または y ≠ 0 の場合、

したがって、atan2 の勾配は次式で与えられる。

関数 atan2 を角度関数 1=θ(x, y) = atan2(y, x) （定数を除いて定義）として省略して表すと、全微分について次の式が得られる:

関数 atan2 は、負の x 軸に沿って不連続であるが、角度を連続的に定義できないという事実を反映して、この導関数は原点を除いて連続的に定義される。これは、角度の微小な（そして実際には局所的な）変化が原点を除くすべての場所で定義できるという事実を反映している。この導関数をパスに沿って積分するとパス全体の角度が全体的に変化し、閉ループで積分すると回転数が得られる。
微分幾何学の言語では、この導関数は1-形式であり、閉である（導関数が0である）が、完全ではない（0-形式の導関数、つまり関数ではない）。実際、1点を除いた平面（Punctured Plane）の1次のド・ラームコホモロジーを生成する。これはそのような形式の最も基本的な例であり、微分幾何学の基本である。
の偏導関数には三角関数が含まれていないため、三角関数の評価にコストがかかる可能性がある多くのアプリケーション（例：組み込みシステム）で特に役立つ。 

**図による可視化**
任意の半直線上のatan2
この図は、ある半直線に沿ったatan2の値を単位円上に示している。atan2の値はラジアンであり、単位円内に記載されている。標準的な数学の方式に従い、角度は右方向の半直線をゼロとして反時計回りに増加する。ここで、2つの引数の順序が座標と比べて入れ替わっていることに注意が必要である。すなわち、関数atan2(y, x)は座標(x, y)に対応する角度を計算する。
アークタンジェントとatan2関数の比較
この図はと、におけるの値を示している。両方の関数ともに奇関数であり、それぞれとの周期関数である。このため、の実数値における補角となることができる。一例としてのにおける分岐截断、およびのにおける分岐截断が明確に確認できる。
下記の2つの図は、atan2(y, x)およびの上から見た3次元図である。ここで、atan2(y, x)におけるX/Y平面の原点から伸びる半直線が定数値なのに対し、ではX/Y平面の原点を通る直線が定数値である。x > 0において、2つの図は同一の値となる。

**加法定理**
の和は、下記の定理によれば1つの式にまとめることができる。

...ここで.
証明には、 または 、および かつ の二つのケースにわけて行う必要がある。
ここでは前者の または のケースのみにおいて考える。最初に、下記の考察を行う：
#  において  または .
# であり、は複素数の偏角の数値計算である。
# である限り、が成り立つ（オイラーの公式により）。
# .
(4)において、複素数の偏角の定理により、ここで 、従って となる。さらに、全ての正の実数値に対してが成り立ち、 および  とすると、となる。
上記より、次の等式が成り立つ：

Corollary（推論）: もし  および  が2次元のベクトルであり、これらベクトル間の角度を計算するのに を用いた差分の式が頻繁に用いられているとすると、計算結果はの区間となることから、ほとんどのケースではレンジチェックは不要となる。

**東-反時計回り、北-時計回り および 南-時計回り等の変換**
関数は元々数学的に多く用いられる、原点から右の半直線から反時計回りに動く場合の変化について定義している（ここではこれを東-反時計回りと言う）。一方実際の実装系では、北-時計回り および 南-時計回りの変換がよく用いられる。
例えば気象学において、風向は関数を用いて、風の東および北向きの成分を引数として利用して計算されている。 同様にsolar azimuth angleも東および北方向の成分を引数として用いている。風向きは通常北-時計回りで定義されているためであり、太陽の方位角は北-時計回り および 南-時計回り両方を用いて広く計算されていためである。 これらの異なる変換は、下記のように位置の置換およびx/y座標の符号を下記のように変更することで実現できる：-  (東-反時計回り変換)-  (北-時計回り)- . (南-時計回り)
例として、 で の場合、東-反時計回りの場合には、北-時計回りでは、南-時計回りのようになる。
x/y成分の符号の変更と位置の転換は結果として８つのの定義が可能となる。それらは時計回り・反時計回りの４つの方角・東西南北を始点とする。

**プログラミング言語における実装**
atan2の実装はプログラミング言語ごとに異なる。- Microsoft Excel、OpenOffice.org Calc、LibreOffice Calc、Google Spreadsheets, iWork Numbers、およびANSI SQL:2008 standardでは、2つの引数をもつatan2関数はそのままの順序の引数で定義されている （引数の関係の入れ替わりについては図による可視化を参照）。- MathematicaではArcTanx,&hairsp;yの形式が用いられ、引数が一つの場合は通常のアークタンジェントになる。MathematicaではArcTan0,&hairsp;0は不定となる。
入れ替わった順序の引数は下記で用いられている：- C言語のatan2関数を始めとする多くのプログラミング言語では、直交座標系から極座標系への変換の手間を減らすため、引数は入れ替わったものが使われており、atan2(0, 0)も定義されている。実装においては−0を除外している、あるいは+0が引数に指定された場合には単純にゼロと定義している。関数は常に−π, πの間の値を返し、エラーやNaN (Not a Number)を返すことはしない。- Common Lispでは引数の数は可変なので、atan関数は1つの場合とx座標を付加した(atan y x)が定義されている。- Juliaでは、Common Lispと状況が似ており、atan2の代わりに、1引数形式と2引数形式のatanを持っている。しかし、コンパイル時のアグレッシブな最適化を可能にするため、Juliaはこの2つ以外にも多数のメソッドを持っている"Why don't you compile Matlab/Python/R/… code to Julia?" のセクションを参照のこと。。- Intelアーキテクチャのx87命令では、 atan2はFPATAN (floating-point partial arctangent) 命令で実装される。この命令は無限大を扱うことができ、結果は閉区間−π, πの値となる。例えば、有限のxに対し、atan2(∞, x) = +π/2となる。特に両方の引数がゼロである時、FPATANは下記のようになる：
*: atan2(+0, +0) = +0;
*: atan2(+0, −0) = +π;
*: atan2(−0, +0) = −0;
*: atan2(−0, −0) = −π.
 この定義は-0の定義に従ったものとなる。- コード以外での学術論文などの数学的表記では、通常の arctanおよびtan−1の最初の1文字を大文字にしたArctanおよびTan−1が用いられる。用法は複素数の偏角と同様で、となる。- シンボリック算術をサポートする実装系では通常、atan2(0, 0) は不定値あるいはエラーを返す。- -0、無限大やNaNをサポートする実装系（例：IEEE 754）では、−π and −0を含む値を返すように拡張されている場合がある。これら実装系では、NaNが入力された時にNaNあるいは例外を返すよう実装されていることも多い。- -0をサポートする実装系（例：IEEE 754）では、atan2(y,  x)の実装が−0の入力を的確に処理できない場合、atan2(−0, x), x atan2のソースコードが公開されており、IEEEの例外値の対処方法を確認することができる。- ハードウェアによる乗算器を持たない実装系では、atan2関数はCORDICによる数値的に十分な近似により実装されている。よってatan(y)の実装もatan2(y, 1)の実装を用いている場合がある。

**関連項目**
hypot

**脚注**

**注釈**

**出典**

**外部リンク**
 ATAN2 Online calculator- atan2 at Everything2- PicBasic Pro solution atan2 for a PIC18F
その他のatan2の実装・コード- Bearing Between Two Points- Arctan and Polar Coordinates- What's 'Arccos'?