Atan2

atan2（アークタンジェント2）は、関数の一種。「2つの引数を取るarctan（アークタンジェント）」という意味である。x軸の正の向きと、点（ただし、ではない）まで伸ばした半直線（レイ）との間の、ユークリッド平面上における角度として定義される。関数はもしくはの形をとり、値はラジアンで返ってくる。

関数は、プログラミング言語のFortran（IBM社が1961年に実装したFORTRAN-IV）において最初に登場した。元々は、角度を直交座標系のから極座標系のに変換する際に、正確で一意な値が返ってくることを意図して導入された。また、は複素数の偏角を求める際にも利用される。

関数 は、の範囲で、

（ただし、）となる単一の値を返す。

なお、arctanを使って角度を求める際に注意すべきことであるが、が真であるからと言って、

 

であるということが常に言えるとは限らない。

これは、だった場合にのみ当てはまる。もしだった場合は、上の式から導出された角度は、正しい角度とは正反対の方向を指し示している。そして、デカルト点をユークリッド平面上の正しい象限に配置するには、（度数法で言うと180°）の値をに加算または減算する必要がある。これはつまり、正しい角度を出すためにはおよびの符号の情報がそれぞれ別個に必要とされると言うことであり、もし単にをで除算した場合は、その情報が失われてしまうというわけである。その点、atan2は細かいことを気にしなくてもとに代入すれば普通に正しい角度を返してくれるので便利である。

関数の戻り値である角度については、との値を変更しないままでも角度にの任意の整数倍を加算することが可能であるため、つまり区間を適切に設定しないと戻り値が曖昧になってしまうため、関数atan2はその主値として、区間をとしたものが戻り値として返ってくるようになっている（関数arctanの戻り値の区間が(− , )である点との違いに注意）。角度は符号付き角度であり、反時計回りの角度は正、時計回りは負となる。具体的は、もしだった場合はの区間にあり、もしだった場合にはの区間にある、となるように関数の内部で場合分けをしている。

 atan2が生み出された経緯と動機 

関数は、元々は特定のプログラミング言語に実装された関数（サブルーチン）の一つに過ぎなかったが、現在では他の科学技術の分野でもよく使われるものとなっている。その起源は少なくとも、FORTRANのATAN2(Y, X)にまで遡ることができ、現代的なプログラミング言語にも標準的な数学関数ライブラリやパッケージの形で実装されている。例を挙げると、C言語およびC++の標準ライブラリ（標準Cライブラリのmath.hにおけるatan2()関数あるいは標準C++ライブラリのcmathにおけるstd::atan2()関数）、Javaの標準ライブラリにおけるメソッド、C#/F#/VB.NETなどから利用できる.NETの基本クラスライブラリにおけるSystem.Math.Atan2()メソッド、JavaScriptの標準組み込みオブジェクトMath、Pythonのmathモジュール、RubyのMathモジュール、Goのmathパッケージ、などであるが、他にも多数の言語に実装されている。さらに、Perlを始めとするスクリプト言語にも、C言語風のatan2(y, x)関数が実装されていることが多い。

また、単に「便利だから」と言うことも存在の理由の一つである。単一引数のみを取る関数(アークタンジェント関数)では正反対の方向を区別できないと言う弱点がある。例えば、軸とベクトルがなす反時計回りの角度をarctan関数を使って「」として計算した場合、「ラジアン（度数法で）」という答えが返却される。しかし、軸とベクトルの間の角度を同様に「」として計算してみると、期待される返却値は「ラジアン(−135°)」または「ラジアン(225°)」であるにもかかわらず、「ラジアン」が返却される。さらに、軸とベクトルがなす角度を関数で計算しようとするとの評価が必要になってしまい、返却されるのはゼロ除算のエラーとなる。

関数は2つの変数 と から一意なアークタンジェントの値を算出するが、そのとき両変数の正負の符号が実行結果の象限を決定するために利用される。それに基づいて「」を実行したときの結果の中から分岐先の結果を選んで返している。例を挙げると、関数では同じ結果が返される「」 と 「」では、入力値の符号を用いてどちらの解を正解と取るのかを判断している。また、例えば前述の「」を計算しようとしても、ゼロ除算のエラーの代わりに「」を返却することも、同様の方法で行っている。

もちろん、上記の計算を自分で実装すれば極論atan2関数は必要ないが、その実装プログラム中のどこかでミスを犯す危険性がある。それよりも常に一意な正しい結果を返してくれるような関数が存在した方が圧倒的に便利である。そのような経緯からatan2関数が存在するのである。

定義と計算

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

標準の 関数（値域 ）を用いて、次のように表すことができる:
 

重複する4つの半平面を用いたコンパクトな式:
 

アイバーソンの記法を用いれば、さらにコンパクトな式が可能:
 

一見すると条件式のない数式:
 

タンジェントの半角の公式から派生した次の式で を定義することもできる:
 
この式は、上記の定義よりもシンボリックな使用に適している場合がある。ただし、 の丸め誤差の影響が領域 の近くで拡大するため、一般的な浮動小数点数の計算用途には適していない（これにより、yがゼロで除算されることもある）。

これらの膨らんだ丸め誤差を回避するため、先ほどの式を変形:
 

注意:
 これにより、範囲 の結果が生成される。
 上記のように、偏角の主値 は、三角法によって に関連付けることができる。 導出は次のようになる:
 のとき となる。その結果、次式が成立する。
 
 問題の領域は であることに注意。

微分

関数 は2変数関数であるため、2つの偏導関数がある。これらの導関数が存在する点では、 は定数項を除いた に等しくなる。したがって、 または の場合、

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

関数 を角度関数 （定数を除いて定義）として省略して表すと、全微分について次の式が得られる:

関数 は、負の 軸に沿って不連続であるが、角度を連続的に定義できないという事実を反映して、この導関数は原点を除いて連続的に定義される。これは、角度の微小な（そして実際には局所的な）変化が原点を除くすべての場所で定義できるという事実を反映している。この導関数をパスに沿って積分するとパス全体の角度が全体的に変化し、閉ループで積分すると回転数が得られる。

微分幾何学の言語では、この導関数は1-形式であり、閉である（導関数が0である）が、完全ではない（0-形式の導関数、つまり関数ではない）。実際、1点を除いた平面（Punctured Plane）の1次のド・ラームコホモロジーを生成する。これはそのような形式の最も基本的な例であり、微分幾何学の基本である。

 の偏導関数には三角関数が含まれていないため、三角関数の評価にコストがかかる可能性がある多くのアプリケーション（例：組み込みシステム）で特に役立つ。 

図による可視化

この図は、ある半直線に沿ったatan2の値を単位円上に示している。atan2の値はラジアンであり、単位円内に記載されている。標準的な数学の方式に従い、角度は右方向の半直線をゼロとして反時計回りに増加する。ここで、2つの引数の順序が座標と比べて入れ替わっていることに注意が必要である。すなわち、関数は座標に対応する角度を計算する。

この図はと、におけるの値を示している。両方の関数ともに奇関数であり、それぞれとの周期関数である。このため、の実数値における補角となることができる。一例としてのにおける分岐截断、およびのにおける分岐截断が明確に確認できる。

下記の2つの図は、およびの上から見た3次元図である。ここで、におけるX/Y平面の原点から伸びる半直線が定数値なのに対し、ではX/Y平面の原点を通る直線が定数値である。において、2つの図は同一の値となる。

 

 加法定理 

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

...ここで.

証明には、 または 、および かつ の二つのケースにわけて行う必要がある。
ここでは前者の または のケースのみにおいて考える。最初に、下記の考察を行う：

 において または .
 であり、は複素数の偏角の数値計算である。
 である限り、が成り立つ（オイラーの公式により）。
 .

において、複素数の偏角の定理により、ここで 、従って となる。さらに、全ての正の実数値に対してが成り立ち、 および とすると、となる。

上記より、次の等式が成り立つ：

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

 東-反時計回り、北-時計回り および 南-時計回り等の変換 

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

例として、 で の場合、東-反時計回りの場合には、北-時計回りでは、南-時計回りのようになる。

x/y成分の符号の変更と位置の転換は結果として８つのの定義が可能となる。それらは時計回り・反時計回りの４つの方角・東西南北を始点とする。

 プログラミング言語における実装 

atan2の実装はプログラミング言語ごとに異なる。
 Microsoft Excel、OpenOffice.org Calc、LibreOffice Calc、Google Spreadsheets, iWork Numbers、およびANSI SQL:2008 standardでは、2つの引数をもつatan2関数はそのままの順序の引数で定義されている （引数の関係の入れ替わりについてはを参照）。
 MathematicaではArcTan[x, y]の形式が用いられ、引数が一つの場合は通常のアークタンジェントになる。MathematicaではArcTan[0, 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つ以外にも多数のメソッドを持っている。
 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が用いられる。用法は複素数の偏角と同様で、となる。
 シンボリック算術をサポートする実装系では通常、 は不定値あるいはエラーを返す。
 -0、無限大やNaNをサポートする実装系（例：IEEE 754）では、− and −0を含む値を返すように拡張されている場合がある。これら実装系では、NaNが入力された時にNaNあるいは例外を返すよう実装されていることも多い。
 -0をサポートする実装系（例：IEEE 754）では、の実装が−0の入力を的確に処理できない場合、, < 0 の時に−を返すリスクがある。
 netlibで公開されているフリーの算術ライブラリであるFDLIBM (Freely Distributable LIBM)では、atan2のソースコードが公開されており、IEEEの例外値の対処方法を確認することができる。
 ハードウェアによる乗算器を持たない実装系では、関数はによる数値的に十分な近似により実装されている。よっての実装もの実装を用いている場合がある。