atan2
atan2
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/09/28 08:13 UTC 版)




atan2関数は、元々は特定のプログラミング言語に実装された関数(サブルーチン)の一つに過ぎなかったが、現在では他の科学技術の分野でもよく使われるものとなっている。その起源は少なくとも、FORTRANのATAN2(Y, X)
にまで遡ることができ[2]、現代的なプログラミング言語にも標準的な数学関数ライブラリやパッケージの形で実装されている。例を挙げると、C言語およびC++の標準ライブラリ(標準Cライブラリのmath.h
におけるatan2()
関数あるいは標準C++ライブラリのcmath
におけるstd::atan2()
関数)、Javaの標準ライブラリにおけるMath.atan2(double,double)
メソッド、C#/F#/VB.NETなどから利用できる.NETの基本クラスライブラリにおけるSystem.Math.Atan2()
メソッド[3]、JavaScriptの標準組み込みオブジェクトMath、Pythonのmathモジュール、RubyのMathモジュール、Goのmathパッケージ[4]、などであるが、他にも多数の言語に実装されている。さらに、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)の評価が必要になってしまい、返却されるのはゼロ除算のエラーとなる。
atan2関数は2つの変数 y と xから一意なアークタンジェントの値を算出するが、そのとき両変数の正負の符号が実行結果の象限を決定するために利用される。それに基づいて「arctan(y/x)」を実行したときの結果の中から分岐先の結果を選んで返している。例を挙げると、arctan関数では同じ結果が返される「atan2(1, 1) = π/4」 と 「atan2(−1, −1) = −3π/4」では、入力値の符号を用いてどちらの解を正解と取るのかを判断している。また、例えば前述の「arctan(y/0)」を計算しようとしても、ゼロ除算のエラーの代わりに「atan2(1, 0) = π/2」を返却することも、同様の方法で行っている。
もちろん、上記の計算を自分で実装すれば極論atan2関数は必要ないが、その実装プログラム中のどこかでミスを犯す危険性がある。それよりも常に一意な正しい結果を返してくれるような関数が存在した方が圧倒的に便利である。そのような経緯からatan2関数が存在するのである。
定義と計算
定義
関数 atan2 は複素数 x + yi に偏角関数 arg を適用した時の主値を計算する。すなわち、atan2(y, x) = Pr arg(x + yi) = Arg(x + yi) である。偏角は、2π(原点を中心としたちょうど1周の回転に対応)の整数倍を加えたものも同じ角度になるが、atan2 を一意に定義するために範囲
注意:
- これにより、範囲 (−π, π] の結果が生成される。[注釈 3]
- 上記のように、偏角の主値 atan2(y, x) は、三角法によって arctan(y/x) に関連付けることができる。 導出は次のようになる:
-
(x, y) = (r cos θ, r sin θ) のとき tan(θ/2) = y / (r + x) となる。その結果、次式が成立する。
-
任意の半直線上のatan2 この図は、ある半直線に沿ったatan2の値を単位円上に示している。atan2の値はラジアンであり、単位円内に記載されている。標準的な数学の方式に従い、角度は右方向の半直線をゼロとして反時計回りに増加する。ここで、2つの引数の順序が座標と比べて入れ替わっていることに注意が必要である。すなわち、関数atan2(y, x)は座標(x, y)に対応する角度を計算する。
アークタンジェントとatan2関数の比較 加法定理
→詳細は「三角関数の公式の一覧 § 加法定理」を参照原文と比べた結果、この節には多数の(または内容の大部分に影響ある)誤訳があることが判明しています。情報の利用には注意してください。(2023年12月)atan2の実装はプログラミング言語ごとに異なる。
- Microsoft Excel[8]、OpenOffice.org Calc、LibreOffice Calc[9]、Google Spreadsheets,[10] iWork Numbers[11]、およびANSI SQL:2008 standard[12]では、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)
が定義されている。[13] - Juliaでは、Common Lispと状況が似ており、
atan2
の代わりに、1引数形式と2引数形式のatan
を持っている[14]。しかし、コンパイル時のアグレッシブな最適化を可能にするため、Juliaはこの2つ以外にも多数のメソッドを持っている[15][注釈 4]。 - Intelアーキテクチャのx87命令では、
atan2
はFPATAN
(floating-point partial arctangent) 命令で実装される。[16]この命令は無限大を扱うことができ、結果は閉区間[−π, π]の値となる。例えば、有限の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[17]およびTan−1[18]が用いられる。用法は複素数の偏角と同様で、Atan(y, x) = Arg(x + i y)となる。
- シンボリック算術をサポートする実装系では通常、atan2(0, 0) は不定値あるいはエラーを返す。
- -0、無限大やNaNをサポートする実装系(例:IEEE 754)では、−π and −0を含む値を返すように拡張されている場合がある。これら実装系では、NaNが入力された時にNaNあるいは例外を返すよう実装されていることも多い。
- -0をサポートする実装系(例:IEEE 754)では、atan2(y, x)の実装が−0の入力を的確に処理できない場合、atan2(−0, x), x < 0 の時に−πを返すリスクがある。
- netlibで公開されているフリーの算術ライブラリであるFDLIBM (Freely Distributable LIBM)では、
atan2
のソースコードが公開されており、IEEEの例外値の対処方法を確認することができる。 - ハードウェアによる乗算器を持たない実装系では、atan2関数はCORDICによる数値的に十分な近似により実装されている。よってatan(y)の実装もatan2(y, 1)の実装を用いている場合がある。
関連項目
- hypot
脚注
注釈
出典
- ^ http://scipp.ucsc.edu/~haber/ph116A/arg_11.pdf
- ^ Organick, Elliott I. (1966). A FORTRAN IV Primer. Addison-Wesley. pp. 42. "Some processors also offer the library function called ATAN2, a function of two arguments (opposite and adjacent)."
- ^ Math.Atan2(Double, Double) Method (System) | Microsoft Learn
- ^ “src/math/atan2.go”. The Go Programming Language. 2018年4月20日閲覧。
- ^ “Wolf Jung: Mandel, software for complex dynamics”. www.mndynamics.com. 2018年4月20日閲覧。
- ^ Wind Direction Quick Reference, NCAR UCAR Earth Observing Laboratory. https://www.eol.ucar.edu/content/wind-direction-quick-reference
- ^ Zhang, Taiping; Stackhouse, Paul W.; MacPherson, Bradley; Mikovitz, J. Colleen (2021). “A solar azimuth formula that renders circumstantial treatment unnecessary without compromising mathematical rigor: Mathematical setup, application and extension of a formula based on the subsolar point and atan2 function”. Renewable Energy 172: 1333–1340. doi:10.1016/j.renene.2021.03.047.
- ^ “Microsoft Excel Atan2 Method”. Microsoft. 2022年1月9日閲覧。
- ^ “LibreOffice Calc ATAN2”. Libreoffice.org. 2022年1月9日閲覧。
- ^ “Functions and formulas – Docs Editors Help”. support.google.com. 2022年1月9日閲覧。
- ^ “Numbers' Trigonometric Function List”. Apple. 2022年1月9日閲覧。
- ^ “ANSI SQL:2008 standard”. Teradata. 2015年8月20日時点のオリジナルよりアーカイブ。2022年1月9日閲覧。
- ^ “CLHS: Function ASIN, ACOS, ATAN”. LispWorks. 2022年1月9日閲覧。
- ^ “Mathematics · The Julia Language”. docs.julialang.org. 2022年1月9日閲覧。
- ^ “Frequently Asked Questions · The Julia Language”. docs.julialang.org. 2022年1月9日閲覧。
- ^ IA-32 Intel Architecture Software Developer’s Manual. Volume 2A: Instruction Set Reference, A-M, 2004.
- ^ Burger, Wilhelm; Burge, Mark J. (7 July 2010). Principles of Digital Image Processing: Fundamental Techniques. Springer Science & Business Media. ISBN 978-1-84800-191-6 2018年4月20日閲覧。
- ^ Glisson, Tildon H. (18 February 2011). Introduction to Circuit Analysis and Design. Springer Science & Business Media. ISBN 9789048194438 2018年4月20日閲覧。
外部リンク
- ATAN2 Online calculator
- atan2 at Everything2
- PicBasic Pro solution atan2 for a PIC18F
- その他のatan2の実装・コード
-
- a t a n 2のページへのリンク