Dans la bibliothèque complexe C++, la méthode norm()
d'un nombre complexe renvoie en fait le carré de ce que j'ai appris est généralement appelé la "norme".
Référence: std :: norm
Par exemple, std::norm()
sur (3,4) vaut 25.
Pour moi, cela semble très déroutant: pourquoi les gens ont-ils mis en œuvre quelque chose qui ne correspond pas à l'utilisation "habituelle" du nom?
Ce n'est pas un problème de bibliothèque C++ mais une question de terminologie mathématique. En mathématiques, une norme peut signifier différentes choses:
Ce que vous appelez norme est la norme euclidienne, qui est la distance à l'origine. En C++ c'est abs()
. Cette convention de dénomination a l'avantage d'être cohérente pour les nombres complexes et réels (l'origine dans ce dernier cas étant 0,0).
Ce que la bibliothèque C++ appelle norm()
correspond à la norme de champ des nombres complexes aux nombres réels. Il est également connu sous le nom de carré absol .
Post Scriptum: la conception initiale de la bibliothèque de nombres complexes C++ remonte à 1984, avant que les modèles n'existent. Dans l'article (lien sur cette page ), Rose & Stroustrup expliquent que norm()
était destiné à comparer les amplitudes plus rapidement, mais en même temps était plus sujet aux débordements.
post de Christophe, bien que tout à fait correct, ne répond pas réellement à la question pourquoi les termes ont l'air de l'être.
Pour vous donner une réponse définitive pour les raisons, vous devriez demander à quelqu'un du comité standard C++, mais permettez-moi de faire une "supposition éclairée":
Il y avait déjà un nom de fonction std::abs
en cours d'utilisation pour la norme euclidienne pour les valeurs float
et double
, bien avant que complex
en fasse la bibliothèque standard. Pour rester cohérent, les concepteurs de bibliothèques ont choisi de surcharger abs
pour les nombres complexes en conséquence. Et fournir un deuxième alias comme norm
pour la même fonction n'améliorerait pas la bibliothèque, mais ne ferait que créer une certaine confusion.
Mais: il est également très logique de fournir une fonction pour le carré de la norme euclidienne. Pour de nombreux cas d'utilisation (par exemple, tout type d'approche moindres carrés ), cette valeur peut être utilisée à la place de std::abs
, sans la pénalité de performance liée au calcul d'une racine carrée. Si l'on regarde d'autres noms de fonctions dans la bibliothèque standard, il semble assez clair que les concepteurs préfèrent les noms courts, concis et faciles à retenir aux noms artificiels comme square_of_abs
. Ils ont donc décidé d'utiliser norm
, qui peut ne pas exprimer le sens habituel dans l'analyse, mais qui n'est pas du moins intrinsèquement faux dans la théorie des nombres.
Remarque dans différents domaines des mathématiques (ainsi qu'en programmation ou dans d'autres domaines), la terminologie peut dépendre fortement du contexte, il y a souvent plus qu'une "vérité". Une bibliothèque ou un composant standard comme complex
qui est probablement utilisé dans de nombreux contextes différents devra faire des choix de terminologie qui sont toujours mieux adaptés à certains cas, et moins à d'autres.
Mis à part les raisons déjà données, il y a une forte raison de performance: prendre la racine carrée est beaucoup plus lent que les autres calculs nécessaires.
Pour de nombreuses applications, la valeur renvoyée est parfaitement suffisante (comme la comparaison avec d'autres valeurs de norme), et prendre la racine carrée serait un effort inutile. Si vous avez besoin de la racine carrée, vous pouvez toujours le faire avec sqrt(norm(...))
, mais si elle est incluse, il n'y aurait aucun moyen de l'éviter si vous souhaitez enregistrer le travail.
Puisqu'il s'agit d'un modèle, vous pouvez avoir complex<int>
- quel devrait être le type de retour pour la "norme habituelle"? float
? double
? (Utiliser int
serait naturel pour un modèle, mais ne fonctionne pas bien.)
Évidemment, cela peut être résolu de différentes manières, mais ici, la norme évite cette question en renvoyant ce qui serait normalement le carré de la norme.