数学において、ピタゴラスの加法は、 2 辺が与えられたときに直角三角形の斜辺の長さを計算する実数の二項演算です。ピタゴラスの定理によれば、辺が と の三角形の場合、この長さは次のように計算できます。 ここで、 はピタゴラスの加法演算を表します。[1]
この演算は、直交座標から極座標への変換に使用できます。また、加数が複雑な場合のいくつかの式に簡単な表記法と用語を提供します。たとえば、物理学におけるエネルギーと運動量の関係は、次のようになります 。これは、コンピューターで実行される精度が限られた計算によって生じるエラーを回避するように設計された方法で、多くのプログラミングライブラリでhypot関数 として実装されています。信号処理や測定の不確かさの伝播への応用では、同じ演算は求積法の加算とも呼ばれます。[2]これは、2次平均または「平均平方根」 に関連しています。
アプリケーション

ピタゴラスの加算(およびそのhypot関数としての実装)は、直交座標から極座標への変換にatan2関数と一緒に使用されることが多い:[3] [4]
ピタゴラスの加算法を繰り返すと、直方体の直径を求めることができます。これは 2 点間の最長距離、つまり直方体の対角線の長さです。辺の長さが、、 の直方体の場合、この長さは です。
測定値がそれぞれ独立した誤差を持つ場合、求積法は全体の誤差を与えるが、 誤差が独立していない場合、 全体の誤差の上限はとなる 。 [5]
信号処理では、独立したノイズ源から全体のノイズを見つけるために、直交加算が使用されます。たとえば、特定の条件下で、イメージセンサーがショットノイズのデジタル数値を6つ、暗電流ノイズを3つ、ジョンソンナイキストノイズを2つ生成する場合、全体のノイズは デジタル数値であり、[6] より大きなノイズ源が優勢であることを示します。
有限の数値集合の二乗平均平方根は、それらのピタゴラス和を掛け合わせたものです。これは数値の 一般化された平均です。
プロパティ
この演算は結合的かつ可換であり、[7]これ は、 の下にある実数が可換半群を形成することを意味します。
の下の実数は群ではありません。なぜなら、群の各要素は、群演算をそれ自体と単位元に適用した結果でなければならないのに対し、群は負の数を結果として生成できないからです。非負の数では、やはり群ではありません。1 つの数に 2 番目の正の数をピタゴラス加算しても最初の数しか増えず、正の数は逆元を持つことができないからです。代わりに、非負の数では、ゼロを単位元とする 可換モノイドを形成します。
実装
Hypot は、直角三角形の斜辺の長さを計算するために定義された数学関数です。この関数は、コンピュータ上で実行される計算の精度が限られているために生じるエラーを回避するために設計されました。三角形の斜辺の長さを計算するには、 2 つの平方の和の平方根関数を使用できますが、hypot を使用すると、非常に大きい数や非常に小さい数を二乗するときに発生する問題を回避できます。自然数式を使用して計算すると、 の非常に大きい値や小さい値の二乗は、コンピュータで計算すると機械精度の範囲を超え、算術アンダーフローとオーバーフローによって不正確な結果が生じる可能性があります。hypot 関数は、この問題を起こさずに結果を計算できるように設計されています。[8]
hypotへのどちらかの入力が無限大の場合、結果は無限大になります。これはもう一方の入力の可能なすべての値に対して当てはまるため、IEEE 754浮動小数点標準では、もう一方の入力が数値でない(NaN)場合でもこれが当てはまることが求められます。[9]
C++17以降、3D計算用のhypot関数が追加されました。[10]
計算順序
単純な実装の難しさは、中間結果が拡張精度で計算されない限り、オーバーフローまたはアンダーフローする可能性があることです。一般的な実装手法は、必要に応じて値を交換し、 とし、同等の形式を使用することです。
の計算は、と が両方ともゼロでない限りオーバーフローしません。 がアンダーフローする場合、最終結果は に等しくなり、これは計算の精度の範囲内で正しいです。平方根は 1 から 2 の間の値で計算されます。最後に、 による乗算はアンダーフローすることはなく、結果が大きすぎて表現できない場合にのみオーバーフローします。[8]この実装には、追加の浮動小数点除算が必要になるという欠点があります。乗算と加算は通常、除算と平方根よりもはるかに高速であるため、単純な実装のコストが 2 倍になる可能性があります。通常、実装は 2.5 ~ 3 倍遅くなります。[11]
より複雑な実装では、入力をより多くのケースに分割することでこれを回避します。
- が よりはるかに大きい場合、は機械精度 の範囲内になります。
- オーバーフローが発生した場合、との両方に小さなスケーリング係数(たとえば、IEEE 単精度の場合は 2 −64 )を掛け、オーバーフローしない単純なアルゴリズムを使用して、結果に(大きな)逆数(たとえば、 2 64 )を掛けます。
- アンダーフローが発生した場合は、上記と同様にスケーリングしますが、スケーリング係数を逆にして中間値をスケールアップします。
- それ以外の場合は、単純なアルゴリズムを安全に使用できます。
しかし、この実装では、異なるケースによってジャンプ予測が不正確になると非常に遅くなります。追加の技術により、例えば1ulp未満など、より正確に結果を計算できます。 [ 8]
プログラミング言語のサポート
ピタゴラスの加算関数は、 CSS 、 [ 12] C++11、[13] D、[14] Fortran(Fortran 2008以降)、[15] Go、[16] JavaScript(ES2015以降)、[17] Julia、[18] Java(バージョン1.5以降)、[19] Kotlin、[20] MATLAB、[21] PHP、[22] Python、[23] Ruby、[24] Rust、[25] Scala [26]など、多くのプログラミング言語 やライブラリでhypot関数として存在します。
Metafont に++は、ピタゴラスの加算と減算が、それぞれとという名前で組み込み演算として用意されています+-+。
参照
参考文献
- ^ Moler, Cleve; Morrison, Donald (1983). 「平方根をピタゴラス和に置き換える」IBM Journal of Research and Development . 27 (6): 577–581. CiteSeerX 10.1.1.90.5651 . doi :10.1147/rd.276.0577.
- ^ ジョンソン、デビッド L. (2017)。「12.2.3 求積法による加算」。産業衛生と環境保健科学の包括的実践のための統計ツール。ジョン ワイリー アンド サンズ。p. 289。ISBN 9781119143017。
- ^ 「SIN (3M): 三角関数とその逆関数」。Unixプログラマーズ マニュアル: リファレンス ガイド(4.3 Berkeley Software Distribution Virtual VAX-11 バージョン ed.)。カリフォルニア大学バークレー校、電気工学およびコンピュータ サイエンス学部。1986 年 4 月。
- ^ Beebe, Nelson HF (2017). 数学関数計算ハンドブック: MathCW ポータブルソフトウェアライブラリを使用したプログラミング。Springer。p. 70。ISBN 9783319641102。
- ^ DB Schneider、「測定システムにおける誤差分析」、1962年標準研究所会議議事録、94ページ
- ^ JT Bushberg 他著「医用画像の基本物理学」、セクション 10.2.7、Wolters Kluwer Health
- ^ ファルマーニュ、ジャン=クロード(2015). 「抽象的な「下段研」タイプの公理から有意義な科学法則を導き出す: 5 つの例」。数学の方程式。89 (2): 393–435。土井:10.1007/s00010-015-0339-1。MR 3340218。S2CID 121424613 。
- ^ abc Borges, Carlos F. (2021). 「アルゴリズム1014: hypot(x, y) の改良アルゴリズム」. ACM Transactions on Mathematical Software . 47 (1): 9:1–9:12. arXiv : 1904.09481 . doi :10.1145/3428446. S2CID 230588285.
- ^ Fog, Agner (2020-04-27). 「浮動小数点例外の追跡と NAN の伝播」(PDF) . p. 6.
- ^ 一般的な数学関数 std::hypot、std::hypotf、std::hypotl
- ^ 32 ビットおよび 64 ビットの浮動小数点数を最大限に最適化したさまざまなコンパイラを使用して、ARM および x64 (Intel および AMD) で測定されました。
- ^ Cimpanu、Catalin。「CSS が三角関数のサポートを取得」ZDNet。2019年 11 月 1 日閲覧。
- ^ 「Hypot - C++ リファレンス」。
- ^ 「STD.math - Dプログラミング言語」。
- ^ 「Fortran 2008 の新機能」(PDF)。
- ^ 「数学パッケージ - math - PKG.go.dev」。
- ^ 「Math.hypot() - JavaScript | MDN」。2023年2月21日。
- ^ 「数学 · Julia 言語」。
- ^ “数学 (Java 2 プラットフォーム SE 5.0)”.
- ^ 「hypot - Kotlinプログラミング言語」Kotlin 。 2018年3月19日閲覧。
- ^ 「平方和の平方根 (斜辺) - MATLAB hypot - MathWorks Benelux」.
- ^ 「PHP: Hypot - マニュアル」.
- ^ 「Math — 数学関数 — Python 3.9.7 ドキュメント」。
- ^ 「モジュール: Math (Ruby 3.0.2)」.
- ^ 「F64 - 錆」.
- ^ 「Scala 標準ライブラリ 2.13.6 - scala.math」。
