Atan2

atan2（アークタンジェント2）は、関数の一種。「2つの引数を取るarctan（アークタンジェント）」という意味である。x軸の正の向きと、点（ただし、ではない）まで伸ばした半直線（レイ）との間の、ユークリッド平面上における角度として定義される。関数はformula_1もしくはformula_2の形をとり、値はラジアンで返ってくる。
関数formula_1は、プログラミング言語のFortran (IBM社が1961年に実装したFORTRAN-IV)において最初に登場した。元々は、角度を直交座標系のから極座標系のに変換する際に、正確で一意な値が返ってくることを意図して導入された。また、formula_1は複素数formula_5の偏角 (「位相」とも言う)を求める際にも利用される。
関数formula_1 は、の範囲で、
（ただし、）となる単一の値を返す。
なお、arctanを使って角度を求める際に注意すべきことであるが、formula_8が真であるからと言って、
であるということが常に言えるとは限らない。
これは、だった場合にのみ当てはまる。もしだった場合は、上の式から導出された角度は、正しい角度とは正反対の方向を指し示している。そして、デカルト点をユークリッド平面上の正しい象限に配置するには、formula_10（度数法で言うと180°）の値をに加算または減算する必要がある。これはつまり、正しい角度を出すためにはおよびの符号の情報がそれぞれ別個に必要とされると言うことであり、もし単にをで除算した場合は、その情報が失われてしまうというわけである。その点、atan2は細かいことを気にしなくてもyとxに代入すれば普通に正しい角度を返してくれるので便利である。
関数formula_1の戻り値である角度については、との値を変更しないままでも角度にの任意の整数倍を加算することが可能であるため、つまり区間をちゃんと設定しないと戻り値の値が曖昧になってしまうため、関数atan2はその主値として、区間をとしたものが戻り値として返ってくるようになっている（関数arctanの戻り値の区間が(− , )である点との違いに注意）。角度 は符号付き角度であり、反時計回りの角度は正、時計回りは負となる。具体的に言うと、もしだった場合は の区間にあり、もしだった場合にはの区間にある、と言う感じになるように関数formula_1の内部で場合分けをしている。
atan2が生み出された経緯と動機.
関数は、元々は特定のプログラミング言語に実装された関数の一つに過ぎなかったが、現在では他の科学技術の分野でもよく使われるものとなっている。その起源は少なくとも、古のプログラミング言語であるFORTRANにまで遡ることができるが、現在においては他の現代的なプログラミング言語においても実装されている。例を挙げると、C言語のmath.h 標準Cライブラリ、JavaのMathライブラリ、.NETのSystem.Math (C#やVB.NETなどから利用できる)、Pythonのmathモジュール、RubyのMathモジュール、Goのmathパッケージ、などであるが、もちろん他にもたくさんの言語に実装されている。さらに言うと、Perlを始めとするスクリプト言語にも、C言語風のcodice_1関数が実装されていることが多い。
atan2関数が生み出された背景として、単一引数のみを取るアークタンジェント（arctan関数）は正反対の方向を区別できない、と言う使い勝手の悪さがある。例えば、軸とベクトルがなす反時計回りの角度を、arctan関数を使って「」のような形で計算した場合、「ラジアン（つまり度数法で言うと）」という答えが返ってくる。しかし、軸とベクトルの間の角度を同様に、「」のような形で計算してみると、期待される答えは「ラジアン(−135°)」または「ラジアン(225°)」であるにもかかわらず、やっぱり「ラジアン」が返ってくる。arctan関数の使い勝手の悪さをさらに言うと、軸とベクトルがなす角度をarctan関数で計算しようとすると、これはの評価が必要になるわけだが、こんなことをさせるとコンピューターはゼロ除算のエラーを吐いてバグる。
atan2関数は、2つの変数 と から一意なアークタンジェントの値を算出するが、そのとき両変数の正負の符号が、実行結果の象限を決定するために利用される。それに基づいて、アークタンジェントで「」したときの結果の中から、求める値が出るような分岐先に飛ばしている。例を挙げると、「」 と 「」のどちらに分岐するのか、と言ったことを判別している。また、例えば「ゼロ除算のエラーを吐いてバグる」の代わりに「」に分岐させるときも、同様の方法で飛ばしている。
もちろん、場合によって必要な象限補正と例外処理をいちいち精査することで、上記の計算を力技で行うことは可能だが、そんなことをするよりも、常に一意な正しい結果を返してくれるような1つの関数が存在した方が便利である。そんな経緯でatan2関数が存在する。関数は様々な応用（アプリケーション）において有用であり、例えばユークリッド空間上におけるユークリッド点に関して、1つの点から別の点へと至る方向ベクトルを調べるのに便利である。主な用途としては、コンピューターグラフィックス（CG）における回転において、回転行列をオイラー角に変換する際に使われる。
定義と計算.
定義
関数 は複素数 に偏角関数 を適用した時の主値を計算する。すなわち、 である。偏角は、（原点を中心としたちょうど1周の回転に対応）の整数倍を加えたものも同じ角度になるが、 を一意に定義するために範囲 formula_13 の主値を使用する。つまり、 とする。
標準の 関数（値域 ）を用いて、次のように表すことができる:
重複する4つの半平面を用いたコンパクトな式:
アイバーソンの記法を用いれば、さらにコンパクトな式が可能:
一見すると条件式のない数式:
タンジェントの半角の公式から派生した次の式で を定義することもできる:
この式は、上記の定義よりもシンボリックな使用に適している場合がある。ただし、formula_18 の丸め誤差の影響が領域 の近くで拡大するため、一般的な浮動小数点数の計算用途には適していない（これにより、"y"がゼロで除算されることもある）。
これらの膨らんだ丸め誤差を回避するため、先ほどの式を変形:
注意:
微分.
関数 は2変数関数であるため、2つの偏導関数がある。これらの導関数が存在する点では、 は定数項を除いた に等しくなる。したがって、 または の場合、
したがって、atan2 の勾配は次式で与えられる。
関数 を角度関数 （定数を除いて定義）として省略して表すと、全微分について次の式が得られる:
関数 は、負の 軸に沿って不連続であるが、角度を連続的に定義できないという事実を反映して、この導関数は原点を除いて連続的に定義される。これは、角度の微小な（そして実際には局所的な）"変化"が原点を除くすべての場所で定義できるという事実を反映している。この導関数をパスに沿って積分するとパス全体の角度が全体的に変化し、閉ループで積分すると回転数が得られる。
微分幾何学の言語では、この導関数は1-形式であり、閉である（導関数が0である）が、完全ではない（0-形式の導関数、つまり関数ではない）。実際、1点を除いた平面（Punctured Plane）の1次のド・ラームコホモロジーを生成する。これはそのような形式の最も基本的な例であり、微分幾何学の基本である。
 の偏導関数には三角関数が含まれていないため、三角関数の評価にコストがかかる可能性がある多くのアプリケーション（例：組み込みシステム）で特に役立つ。 
図による可視化.
この図は、ある半直線に沿ったatan2の値を単位円上に示している。atan2の値はラジアンであり、単位円内に記載されている。標準的な数学の方式に従い、角度は右方向の半直線をゼロとして反時計回りに増加する。ここで、２つの引数の順序が座標と比べて入れ替わっていることに注意が必要である。すなわち、関数は座標に対応する角度を計算する。
この図はformula_24と、formula_25におけるのformula_26値を示している。両方の関数ともに奇関数であり、それぞれformula_10とformula_28の周期関数である。このため、formula_29の実数値における補角となることが出来る。一例としてformula_30のformula_31における分岐截断、およびformula_32のformula_33における分岐截断が明確に確認出来る。
下記の２つの図は、およびの上から見た三次元図である。ここで、における"X"/"Y"平面の原点から伸びる半直線が定数値なのに対し、では"X"/"Y"平面の原点を通る直線が定数値である。において、２つの図は同一の値となる。
加法定理.
formula_34の和は、下記の定理によれば一つの式にまとめることができる。
...ここでformula_36.
証明には、formula_37 または formula_38、およびformula_39 かつ formula_40の二つのケースにわけて行う必要がある。
ここでは前者のformula_37 または formula_38のケースのみにおいて考える。最初に、下記の考察を行う：
(4)において、複素数の偏角の定理によりformula_51、ここで formula_52、従って formula_53となる。さらに、全ての正の実数値formula_54に対してformula_55が成り立ち、formula_56 および formula_57 とすると、formula_58となる。
上記より、次の等式が成り立つ：
Corollary（推論）: もし formula_60 および formula_61 が２次元のベクトルであり、これらベクトル間の角度を計算するのに formula_34を用いた差分の式が頻繁に用いられているとすると、計算結果はformula_13の区間となることから、ほとんどのケースではレンジチェックは不要となる。
東-反時計回り、北-時計回り および 南-時計回り等の変換.
formula_64関数は元々数学的に多く用いられる、原点から右の半直線から反時計回りに動く場合の変化について定義している（ここではこれを東-反時計回りと言う）。一方実際の実装系では、北-時計回り および 南-時計回りの変換がよく用いられる。
例えば気象学において、風向はformula_64関数を用いて、風の東および北向きの成分を引数として利用して計算されている。 同様にも東および北方向の成分を引数として用いている。風向きは通常北-時計回りで定義されているためであり、太陽の方位角は北-時計回り および 南-時計回り両方を用いて広く計算されていためである。 これらの異なる変換は、下記のように位置の置換およびx/y座標の符号を下記のように変更することで実現できる：
例として、formula_69 で formula_70の場合、東-反時計回りの場合にはformula_71、北-時計回りではformula_72南-時計回りformula_73のようになる。
x/y成分の符号の変更と位置の転換は結果として８つのformula_64の定義が可能となる。それらは時計回り・反時計回りの４つの方角・東西南北を始点とする。
プログラミング言語における実装.
atan2のプログラミング言語での実装は言語毎に異なる。
入れ替わった順序の引数formula_76は下記で用いられている：