it-swarm.com.de

Warum ist die Norm einer komplexen Zahl in der komplexen C ++ - Bibliothek eigentlich das Quadrat der Norm?

In der komplexen C++ - Bibliothek gibt die Methode norm() einer komplexen Zahl tatsächlich das Quadrat zurück, das ich gelernt habe und das normalerweise als "Norm" bezeichnet wird.

Referenz: std :: norm

Zum Beispiel ist std::norm() von (3,4) 25.

Für mich sieht das sehr verwirrend aus: Warum haben die Leute etwas implementiert, das nicht der "üblichen" Verwendung des Namens entspricht?

24

Dies ist kein Problem der C++ - Bibliothek, sondern eine Frage der mathematischen Terminologie. In der Mathematik kann ein Norm verschiedene Dinge bedeuten:

  • Was Sie Norm nennen, ist die euklidische Norm, dh die Entfernung zum Ursprung. In C++ ist es abs() . Diese Namenskonvention hat den Vorteil, dass sie für komplexe und reelle Zahlen konsistent ist (der Ursprung im letzteren Fall ist 0.0).

  • Was die C++ - Bibliothek aufruft norm() entspricht der Feldnorm von komplexen Zahlen zu reellen Zahlen. Es ist auch bekannt als absolutes Quadrat .

Post Scriptum: Das frühe Design der C++ - Bibliothek für komplexe Zahlen stammt aus dem Jahr 1984, bevor es Vorlagen gab. In dem Artikel (Link auf diese Seite ) erklären Rose & Stroustrup, dass norm() dazu gedacht war, Größen schneller zu vergleichen, gleichzeitig aber mehr Überläufen ausgesetzt war.

38
Christophe

Christophes Beitrag beantwortet zwar vollständig, beantwortet jedoch nicht die Frage , warum die Begriffe so aussehen, wie sie aussehen.

Um Ihnen aus den Gründen eine eindeutige Antwort zu geben, müssten Sie jemanden vom C++ - Standardkomitee fragen, aber lassen Sie mich eine "fundierte Vermutung" anstellen:

  • Es gab bereits einen Funktionsnamen std::abs Für die euklidische Norm für float und double Werte, lange bevor complex es in die Standardbibliothek schaffte. Um konsistent zu bleiben, haben die Bibliotheksdesigner beschlossen, abs für komplexe Zahlen entsprechend zu überladen. Und die Bereitstellung eines zweiten Alias ​​wie norm für dieselbe Funktion würde die Bibliothek nicht verbessern, sondern nur Verwirrung stiften.

  • Aber: Es ist auch sehr sinnvoll, eine Funktion für das Quadrat der euklidischen Norm bereitzustellen. Für viele Anwendungsfälle (z. B. jede Art von kleinste Quadrate Ansatz) kann dieser Wert anstelle von std::abs Verwendet werden, ohne dass die Berechnung einer Quadratwurzel beeinträchtigt wird. Wenn man sich andere Funktionsnamen in der Standardbibliothek ansieht, scheint es ziemlich klar, dass die Designer kurze, prägnante und leicht zu merkende Namen künstlichen Namen wie square_of_abs Vorziehen. Deshalb haben sie sich für norm entschieden, was möglicherweise nicht die übliche Bedeutung in der Analyse ausdrückt, aber in der Zahlentheorie zumindest nicht von Natur aus falsch ist.

Beachten Sie, dass in verschiedenen Bereichen der Mathematik (sowie in der Programmierung oder anderen Bereichen) die Terminologie stark vom Kontext abhängen kann. Oft gibt es mehr als nur "eine Wahrheit". Eine Standardbibliothek oder -komponente wie complex, die wahrscheinlich in vielen verschiedenen Kontexten verwendet wird, muss Terminologieentscheidungen treffen, die für einige Fälle immer besser und für andere weniger geeignet sind.

25
Doc Brown

Abgesehen von den bereits angegebenen Gründen gibt es einen starken Leistungsgrund: Die Quadratwurzel zu ziehen ist erheblich langsamer als die anderen erforderlichen Berechnungen.

Für viele Anwendungen ist der zurückgegebene Wert vollkommen ausreichend (wie im Vergleich zu anderen Normwerten), und die Quadratwurzel zu ziehen wäre unnötiger Aufwand. Wenn Sie die Quadratwurzel benötigen, können Sie dies immer mit sqrt(norm(...)) tun. Wenn sie jedoch enthalten ist, können Sie sie nicht vermeiden, wenn Sie die Arbeit speichern möchten.

6
Aganju

Da es sich um eine Vorlage handelt, können Sie complex<int> - Was sollte der Rückgabetyp für die "übliche Norm" sein? float? double? (Die Verwendung von int wäre für eine Vorlage natürlich, funktioniert aber nicht gut.)

Natürlich kann es auf verschiedene Arten gelöst werden, aber hier vermeidet der Standard diese Frage, indem er zurückgibt, was normalerweise das Quadrat der Norm wäre.

2
Hans Olsson