Atan2
Corollary(推論): もし ( y 1 , x 1 ) {\displaystyle (y_{1},x_{1})} および ( y 2 , x 2 ) {\displaystyle (y_{2},x_{2})} が2次元のベクトルであり、これらベクトル間の角度を計算するのに atan2 {\displaystyle \operatorname {atan2} } を用いた差分の式が頻繁に用いられているとすると、計算結果は ( − π , π ] {\displaystyle (-\pi ,\pi ]} の区間となることから、ほとんどのケースではレンジチェックは不要となる。
a t a n 2 {\displaystyle \mathrm {atan2} } 関数は元々数学的に多く用いられる、原点から右の半直線から反時計回りに動く場合の変化について定義している(ここではこれを東-反時計回りと言う)。一方実際の実装系では、北-時計回り および 南-時計回りの変換がよく用いられる。 例えば気象学において、風向は a t a n 2 {\displaystyle \mathrm {atan2} } 関数を用いて、風の東および北向きの成分を引数として利用して計算されている。 同様に太陽の方位角(英語版)も東および北方向の成分を引数として用いている。風向きは通常北-時計回りで定義されているためであり、太陽の方位角は北-時計回り および 南-時計回り両方を用いて広く計算されていためである。 これらの異なる変換は、下記のように位置の置換およびx/y座標の符号を下記のように変更することで実現できる:
a t a n 2 ( y , x ) , {\displaystyle \mathrm {atan2} (y,x),\;\;\;\;\;} (東-反時計回り変換)
a t a n 2 ( x , y ) , {\displaystyle \mathrm {atan2} (x,y),\;\;\;\;\;} (北-時計回り)
a t a n 2 ( − x , − y ) {\displaystyle \mathrm {atan2} (-x,-y)} . (南-時計回り)
実装においては−0を除外している、あるいは+0が引数に指定された場合には単純にゼロと定義している。関数は常に[−π, π]の間の値を返し、エラーやNaN (Not a Number)を返すことはしない。
Common Lispでは引数の数は可変なので、atan関数は1つの場合とx座標を付加した(atan y x)が定義されている。
Juliaでは、Common Lisp同様にatan2関数を定義する代わりに、atanが1つまたは2つの引数を持っている。 1つの関数が複数のメソッドを行う副作用として、コンパイル時の最適化時間が多くなってしまう。
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の定義に従ったものとなる。
atan2関数は、元々は特定のプログラミング言語に実装された関数の一つに過ぎなかったが、現在では他の科学技術の分野でもよく使われるものとなっている。その起源は少なくとも、古のプログラミング言語であるFORTRANにまで遡ることができるが、現在においては他の現代的なプログラミング言語においても実装されている。例を挙げると、C言語のmath.h 標準Cライブラリ、JavaのMathライブラリ、.NETのSystem.Math (C#やVB.NETなどから利用できる)、Pythonのmathモジュール、RubyのMathモジュール、Goのmathパッケージ、などであるが、もちろん他にもたくさんの言語に実装されている。さらに言うと、Perlを始めとするスクリプト言語にも、C言語風のatan2(y, x)関数が実装されていることが多い。
atan2関数が生み出された背景として、単一引数のみを取るアークタンジェント(arctan関数)は正反対の方向を区別できない、と言う使い勝手の悪さがある。例えば、x軸とベクトル(1, 1)がなす反時計回りの角度を、arctan関数を使って「arctan(1/1)」のような形で計算した場合、「π/4ラジアン(つまり度数法で言うと45°)」という答えが返ってくる。しかし、x軸とベクトル(−1, −1)の間の角度を同様に、「arctan(−1/−1)」のような形で計算してみると、期待される答えは「−3π/4ラジアン(−135°)」または「5π/4ラジアン(225°)」であるにもかかわらず、やっぱり「π/4ラジアン」が返ってくる。