Atan2


atan2(アークタンジェント2)は、関数の一種。「2つの引数を取るarctan(アークタンジェント)」という意味である。x軸の正の向きと、点テンプレート:Math(ただし、テンプレート:Mathではない)まで伸ばした半直線(レイ)との間の、ユークリッド平面上における角度として定義される。関数はもしくはの形をとり、値はラジアンで返ってくる。
関数は、プログラミング言語のFortran(IBM社が1961年に実装したFORTRAN-IV)において最初に登場した。元々は、角度テンプレート:Mvarを直交座標系のテンプレート:Mathから極座標系のテンプレート:Mathに変換する際に、正確で一意な値が返ってくることを意図して導入された。また、は複素数の偏角テンプレート:Efnを求める際にも利用される。
関数 は、テンプレート:Mathの範囲で、
(ただし、テンプレート:Math)となる単一の値テンプレート:Mvarを返す。
なお、arctanを使って角度テンプレート:Mvarを求める際に注意すべきことであるが、が真であるからと言って、
であるということが常に言えるとは限らない。
これは、テンプレート:Mathだった場合にのみ当てはまる。もしテンプレート:Mathだった場合は、上の式から導出された角度は、正しい角度とは正反対の方向を指し示している。そして、デカルト点テンプレート:Mathをユークリッド平面上の正しい象限に配置するには、(度数法で言うと180°)の値をテンプレート:Mvarに加算または減算する必要がある[1]。これはつまり、正しい角度を出すためにはテンプレート:Mvarおよびテンプレート:Mvarの符号の情報がそれぞれ別個に必要とされると言うことであり、もし単にテンプレート:Mvarをテンプレート:Mvarで除算した場合は、その情報が失われてしまうというわけである。その点、atan2は細かいことを気にしなくてもテンプレート:Mvarとテンプレート:Mvarに代入すれば普通に正しい角度を返してくれるので便利である。
関数の戻り値である角度テンプレート:Mvarについては、テンプレート:Mvarとテンプレート:Mvarの値を変更しないままでも角度テンプレート:Mvarにテンプレート:Mathの任意の整数倍を加算することが可能であるため、つまり区間を適切に設定しないと戻り値が曖昧になってしまうため、関数atan2はその主値として、区間をテンプレート:Open-closedとしたものが戻り値として返ってくるようになっている(関数arctanの戻り値の区間が(−テンプレート:Sfrac , テンプレート:Sfrac)である点との違いに注意)。角度テンプレート:Mvarは符号付き角度であり、反時計回りの角度は正、時計回りは負となる。具体的は、もしテンプレート:Mathだった場合はテンプレート:Closed-closedの区間にあり、もしテンプレート:Mathだった場合にはテンプレート:Open-openの区間にある、となるように関数の内部で場合分けをしている。
atan2が生み出された経緯と動機

テンプレート:Math関数は、元々は特定のプログラミング言語に実装された関数(サブルーチン)の一つに過ぎなかったが、現在では他の科学技術の分野でもよく使われるものとなっている。その起源は少なくとも、FORTRANのATAN2(Y, X)にまで遡ることができ[2]、現代的なプログラミング言語にも標準的な数学関数ライブラリやパッケージの形で実装されている。例を挙げると、C言語およびC++の標準ライブラリ(標準Cライブラリのmath.hにおけるatan2()関数あるいは標準C++ライブラリのcmathにおけるstd::atan2()関数)、Javaの標準ライブラリにおけるテンプレート:Javadoc:SEメソッド、C#/F#/VB.NETなどから利用できる.NETの基本クラスライブラリにおけるSystem.Math.Atan2()メソッド[3]、JavaScriptの標準組み込みオブジェクトMath、Pythonのmathモジュール、RubyのMathモジュール、Goのmathパッケージ[4]、などであるが、他にも多数の言語に実装されている。さらに、Perlを始めとするスクリプト言語にも、C言語風のatan2(y, x)関数が実装されていることが多い。
また、単に「便利だから」と言うことも存在の理由の一つである。単一引数のみを取るテンプレート:Math関数(アークタンジェント関数)では正反対の方向を区別できないと言う弱点がある。例えば、テンプレート:Mvar軸とベクトルテンプレート:Mathがなす反時計回りの角度をarctan関数を使って「テンプレート:Math」として計算した場合、「テンプレート:Mathラジアン(度数法でテンプレート:Math)」という答えが返却される。しかし、テンプレート:Mvar軸とベクトルテンプレート:Mathの間の角度を同様に「テンプレート:Math」として計算してみると、期待される返却値は「テンプレート:Mathラジアン(−135°)」または「テンプレート:Mathラジアン(225°)」であるにもかかわらず、「テンプレート:Mathラジアン」が返却される。さらに、テンプレート:Mvar軸とベクトルテンプレート:Mathがなす角度をテンプレート:Math関数で計算しようとするとテンプレート:Mathの評価が必要になってしまい、返却されるのはゼロ除算のエラーとなる。
テンプレート:Math関数は2つの変数 テンプレート:Mvar と テンプレート:Mvarから一意なアークタンジェントの値を算出するが、そのとき両変数の正負の符号が実行結果の象限を決定するために利用される。それに基づいて「テンプレート:Math」を実行したときの結果の中から分岐先の結果を選んで返している。例を挙げると、テンプレート:Math関数では同じ結果が返される「テンプレート:Math」 と 「テンプレート:Math」では、入力値の符号を用いてどちらの解を正解と取るのかを判断している。また、例えば前述の「テンプレート:Math」を計算しようとしても、ゼロ除算のエラーの代わりに「テンプレート:Math」を返却することも、同様の方法で行っている。
もちろん、上記の計算を自分で実装すれば極論atan2関数は必要ないが、その実装プログラム中のどこかでミスを犯す危険性がある。それよりも常に一意な正しい結果を返してくれるような関数が存在した方が圧倒的に便利である。そのような経緯からatan2関数が存在するのである。
定義と計算
定義
関数 テンプレート:Math は複素数 テンプレート:Math に偏角関数 テンプレート:Math を適用した時の主値を計算する。すなわち、テンプレート:Math である。偏角は、テンプレート:Math(原点を中心としたちょうど1周の回転に対応)の整数倍を加えたものも同じ角度になるが、テンプレート:Math を一意に定義するために範囲 の主値を使用する。つまり、テンプレート:Math とする。
標準の テンプレート:Math 関数(値域 テンプレート:Open-open)を用いて、次のように表すことができる:
重複する4つの半平面を用いたコンパクトな式:
アイバーソンの記法を用いれば、さらにコンパクトな式が可能:
| テンプレート:Efn |
一見すると条件式のない数式:
タンジェントの半角の公式から派生した次の式で テンプレート:Math を定義することもできる:
この式は、上記の定義よりもシンボリックな使用に適している場合がある。ただし、 の丸め誤差の影響が領域 テンプレート:Math の近くで拡大するため、一般的な浮動小数点数の計算用途には適していない(これにより、yがゼロで除算されることもある)。
これらの膨らんだ丸め誤差を回避するため、先ほどの式を変形:

注意:
- これにより、範囲 テンプレート:Open-closed の結果が生成される。テンプレート:Efn
- 上記のように、偏角の主値 テンプレート:Math は、三角法によって テンプレート:Math に関連付けることができる。 導出は次のようになる:
- テンプレート:Math のとき テンプレート:Math となる。その結果、次式が成立する。
- 問題の領域は テンプレート:Math であることに注意。
微分
テンプレート:Details 関数 テンプレート:Math は2変数関数であるため、2つの偏導関数がある。これらの導関数が存在する点では、テンプレート:Math は定数項を除いた テンプレート:Math に等しくなる。したがって、テンプレート:Math または テンプレート:Math の場合、
したがって、atan2 の勾配は次式で与えられる。
関数 テンプレート:Math を角度関数 テンプレート:Math (定数を除いて定義)として省略して表すと、全微分について次の式が得られる:
関数 テンプレート:Math は、負の テンプレート:Mvar 軸に沿って不連続であるが、角度を連続的に定義できないという事実を反映して、この導関数は原点を除いて連続的に定義される。これは、角度の微小な(そして実際には局所的な)変化が原点を除くすべての場所で定義できるという事実を反映している。この導関数をパスに沿って積分するとパス全体の角度が全体的に変化し、閉ループで積分すると回転数が得られる。
微分幾何学の言語では、この導関数は1-形式であり、閉である(導関数が0である)が、完全ではない(0-形式の導関数、つまり関数ではない)。実際、1点を除いた平面(Punctured Plane)の1次のド・ラームコホモロジーを生成する。これはそのような形式の最も基本的な例であり、微分幾何学の基本である。
テンプレート:Math の偏導関数には三角関数が含まれていないため、三角関数の評価にコストがかかる可能性がある多くのアプリケーション(例:組み込みシステム)で特に役立つ。
図による可視化

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

この図はと、におけるの値を示している。両方の関数ともに奇関数であり、それぞれとの周期関数である。このため、の実数値における補角となることができる。一例としてのにおける分岐截断、およびのにおける分岐截断が明確に確認できる[5]。
下記の2つの図は、テンプレート:Mathおよびテンプレート:Mathの上から見た3次元図である。ここで、テンプレート:MathにおけるX/Y平面の原点から伸びる半直線が定数値なのに対し、テンプレート:MathではX/Y平面の原点を通る直線が定数値である。テンプレート:Mathにおいて、2つの図は同一の値となる。
加法定理
の和は、下記の定理によれば1つの式にまとめることができる。
...ここで.
証明には、 または 、および かつ の二つのケースにわけて行う必要がある。 ここでは前者の または のケースのみにおいて考える。最初に、下記の考察を行う:
- において または .
- であり、は複素数の偏角の数値計算である。
- である限り、が成り立つ(オイラーの公式により)。
- .
(4)において、複素数の偏角の定理により、ここで 、従って となる。さらに、全ての正の実数値に対してが成り立ち、 および とすると、となる。
上記より、次の等式が成り立つ:
Corollary(推論): もし および が2次元のベクトルであり、これらベクトル間の角度を計算するのに を用いた差分の式が頻繁に用いられているとすると、計算結果はの区間となることから、ほとんどのケースではレンジチェックは不要となる。
東-反時計回り、北-時計回り および 南-時計回り等の変換
関数は元々数学的に多く用いられる、原点から右の半直線から反時計回りに動く場合の変化について定義している(ここではこれを東-反時計回りと言う)。一方実際の実装系では、北-時計回り および 南-時計回りの変換がよく用いられる。 例えば気象学において、風向は関数を用いて、風の東および北向きの成分を引数として利用して計算されている。[6] 同様にテンプレート:仮リンクも東および北方向の成分を引数として用いている。風向きは通常北-時計回りで定義されているためであり、太陽の方位角は北-時計回り および 南-時計回り両方を用いて広く計算されていためである。[7] これらの異なる変換は、下記のように位置の置換およびx/y座標の符号を下記のように変更することで実現できる:
- (東-反時計回り変換)
- (北-時計回り)
- . (南-時計回り)
例として、 で の場合、東-反時計回りの場合には、北-時計回りでは、南-時計回りのようになる。
x/y成分の符号の変更と位置の転換は結果として8つのの定義が可能となる。それらは時計回り・反時計回りの4つの方角・東西南北を始点とする。
プログラミング言語における実装
テンプレート:要改訳 atan2の実装はプログラミング言語ごとに異なる。
- Microsoft Excel[8]、OpenOffice.org Calc、LibreOffice Calc[9]、Google Spreadsheets,[10] iWork Numbers[11]、およびANSI SQL:2008 standard[12]では、2つの引数をもつatan2関数はそのままの順序の引数で定義されている (引数の関係の入れ替わりについてはテンプレート:Section linkを参照)。
- Mathematicaでは
ArcTan[x, y]の形式が用いられ、引数が一つの場合は通常のアークタンジェントになる。MathematicaではArcTan[0, 0]は不定となる。
入れ替わった順序の引数は下記で用いられている:
- C言語の
atan2関数を始めとする多くのプログラミング言語では、直交座標系から極座標系への変換の手間を減らすため、引数は入れ替わったものが使われており、atan2(0, 0)も定義されている。実装においては−0を除外している、あるいは+0が引数に指定された場合には単純にゼロと定義している。関数は常にテンプレート:Closed-closedの間の値を返し、エラーやNaN (Not a Number)を返すことはしない。 - Common Lispでは引数の数は可変なので、
atan関数は1つの場合とx座標を付加した(atan y x)が定義されている。[13] - Juliaでは、Common Lispと状況が似ており、
atan2の代わりに、1引数形式と2引数形式のatanを持っている[14]。しかし、コンパイル時のアグレッシブな最適化を可能にするため、Juliaはこの2つ以外にも多数のメソッドを持っている[15]テンプレート:Efn。 - Intelアーキテクチャのx87命令では、
atan2はFPATAN(floating-point partial arctangent) 命令で実装される。[16]この命令は無限大を扱うことができ、結果は閉区間テンプレート:Closed-closedの値となる。例えば、有限のxに対し、atan2(∞, x)= +テンプレート:Math/2となる。特に両方の引数がゼロである時、FPATANは下記のようになる:atan2(+0, +0)= +0;atan2(+0, −0)= +テンプレート:Math;atan2(−0, +0)= −0;atan2(−0, −0)= −テンプレート:Math.
- この定義は-0の定義に従ったものとなる。
- コード以外での学術論文などの数学的表記では、通常の arctanおよびtan−1の最初の1文字を大文字にしたArctan[17]およびTan−1[18]が用いられる。用法は複素数の偏角と同様で、テンプレート:Mathとなる。
- シンボリック算術をサポートする実装系では通常、テンプレート:Math は不定値あるいはエラーを返す。
- -0、無限大やNaNをサポートする実装系(例:IEEE 754)では、−テンプレート:Math and −0を含む値を返すように拡張されている場合がある。これら実装系では、NaNが入力された時にNaNあるいは例外を返すよう実装されていることも多い。
- -0をサポートする実装系(例:IEEE 754)では、テンプレート:Mathの実装が−0の入力を的確に処理できない場合、テンプレート:Math, テンプレート:Mvar < 0 の時に−テンプレート:Mathを返すリスクがある。
- netlibで公開されているフリーの算術ライブラリであるFDLIBM (Freely Distributable LIBM)では、
atan2のソースコードが公開されており、IEEEの例外値の対処方法を確認することができる。 - ハードウェアによる乗算器を持たない実装系では、テンプレート:Math関数はテンプレート:仮リンクによる数値的に十分な近似により実装されている。よってテンプレート:Mathの実装もテンプレート:Mathの実装を用いている場合がある。
関連項目
脚注
注釈
出典
外部リンク
- ATAN2 Online calculator
- atan2 at Everything2
- PicBasic Pro solution atan2 for a PIC18F
- その他のatan2の実装・コード
- ↑ http://scipp.ucsc.edu/~haber/ph116A/arg_11.pdf
- ↑ テンプレート:Cite book
- ↑ Math.Atan2(Double, Double) Method (System) | Microsoft Learn
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ Wind Direction Quick Reference, NCAR UCAR Earth Observing Laboratory. https://www.eol.ucar.edu/content/wind-direction-quick-reference
- ↑ テンプレート:Cite journal
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ IA-32 Intel Architecture Software Developer’s Manual. Volume 2A: Instruction Set Reference, A-M, 2004.
- ↑ テンプレート:Cite book
- ↑ テンプレート:Cite book