web-dev-qa-db-ja.com

C ++複素数ライブラリの複素数のノルムが実際にノルムの2乗になるのはなぜですか?

C++複素数ライブラリでは、複素数のメソッドnorm()は、実際に私が学んだものの2乗を返します。これは通常「ノルム」と呼ばれます。

参照:std :: norm

たとえば、(3,4)のstd::norm()は25です。

私には、これは非常に混乱しているように見えます。なぜ人々は、名前の「通常の」使用に対応しない何かを実装したのですか?

24

これはC++ライブラリの問題ではなく、数学用語の問題です。数学では、 norm は異なる意味を持ちます:

  • ノルムとは、ユークリッドノルムです。これは、原点までの距離です。 C++では abs() です。この命名規則には、複素数と実数で一貫しているという利点があります(後者の場合、原点は0.0です)。

  • C++ライブラリが呼び出すもの norm() は、複素数から実数までの field norm に対応します。 絶対二乗 とも呼ばれます。

Post Scriptum:C++複素数ライブラリの初期の設計は、テンプレートが存在しなかった1984年にさかのぼります。記事( このページ のリンク)で、Rose&Stroustrupはnorm()は大きさをより速く比較するために意図されていたが、同時にオーバーフローの影響を受けやすいと説明しています

38
Christophe

Christopheの post は完全に正しいものの、実際には質問に答えませんwhy用語は実際のように見えます。

理由について明確な答えを出すには、C++標準委員会の誰かに尋ねる必要がありますが、「推測による推測」をさせてください。

  • floatが標準libになる前に、doublecomplexの値のユークリッドノルムに使用されている関数名std::absがすでに存在していました。したがって、一貫性を保つために、ライブラリの設計者は、それに応じて複素数のabsをオーバーロードすることを選択しました。また、同じ関数にnormのような2番目のエイリアスを指定しても、ライブラリは改善されず、混乱が生じるだけです。

  • しかし:ユークリッドノルムの2乗に関数を提供することも意味があります。多くのユースケース(たとえば、あらゆる種類の least-squares アプローチ)では、この値をstd::absの代わりに使用できます。平方根の計算によるパフォーマンスの低下はありません。標準libで他の関数名を見ると、デザイナーがsquare_of_absのような人工的な名前よりも短くて簡潔で覚えやすい名前を好むのは明らかです。そのため、彼らはnormを使用することにしました。これは、分析では通常の意味を表さないかもしれませんが、少なくとも数論では本質的に間違っていません。

数学のさまざまな分野(およびプログラミングやその他のドメイン)では、用語は文脈に大きく依存する場合があり、「1つの真実」以上のものがあることがよくあります。 complexのような標準ライブラリまたはコンポーネントは、多くの異なるコンテキストで使用される可能性があり、常に特定のケースに適し、他のケースには当てはまらない用語を選択する必要があります。

25
Doc Brown

既に与えられた理由は別として、強力なパフォーマンス上の理由があります。平方根の計算は、他の必要な計算よりもかなり遅いです。

多くのアプリケーションでは、戻り値は(他のノルム値との比較のように)完全に十分であり、平方根を取ることは無駄な努力です。平方根が必要になった場合は、いつでもsqrt(norm(...))を使用して実行できますが、平方根が含まれている場合、作業を保存する場合にそれを回避する方法はありません。

6
Aganju

テンプレートなのでcomplex<int>-戻り値の型は、「通常の規範」に対してどのようにすべきですか? floatdouble? (intを使用するのはテンプレートにとって自然なことですが、うまく機能しません。)

明らかに、それはさまざまな方法で解決できますが、ここでは、標準は通常は標準の2乗になるものを返すことによってその質問を回避します。

2
Hans Olsson