39 votes

Pourquoi le C ++ n'impose-t-il ce complexe que pour une instanciation de type float, double ou long double?

Selon le C++ ISO spec, §26.2/2:

L'effet de l'instanciation du modèle complex pour tout type autre que float, double ou long double n'est pas spécifié.

Pourquoi le standard auteurs explicitement ajouter cette restriction? De ce fait, il indéterminée, par exemple, ce qui se passe si vous faites complex<int> ou complex<MyCustomFixedPointType> et semble comme une restriction artificielle.

Quelle est la raison de cette limitation? Est-il une solution de contournement si vous souhaitez instancier complex avec votre propre type?

Je suis principalement en posant cette question à cause de cette question précédente, dans lequel l'OP était confus quant à pourquoi abs a été de donner bizarre sorties pour complex<int>. Cela dit, ce n'est toujours pas tout à fait logique étant donné que nous aussi nous voulons faire de complex nombre fixe de points de types, de haute précision des nombres réels, etc.

30voto

larsmans Points 167484

Vous ne pouvez pas correctement mise en œuvre, de nombreux std::complex des opérations sur des entiers. E. g.,

template <class T>
T abs(const complex<T> &z);

pour un complex<long> ne peut pas avoir d' T = long de la valeur de retour lorsque les nombres complexes sont représentés comme (real,imag) paires, car il renvoie la valeur de sqrt(pow(z.real(), 2) + pow(z.imag(), 2)). Seules quelques opérations de sens.

Pire encore, l' polar nommé constructeur ne peut pas être fait fiable sans casser le constructeur par défaut et vice versa. La norme de préciser que les "complexes entiers" sont des entiers de Gauss pour eux d'être d'aucune utilité, et que l'un des constructeurs est sévèrement.

Enfin, comment voulez-vous que votre "complexe entier de la division" a servi, et vous aimeriez un "complexe reste" avec qui? :)

En résumant, je pense qu'il serait plus judicieux de spécifier un autre gaussian_int<T> type avec juste un peu d'opérations de greffe de soutien pour l'intégrale T sur std::complex.

12voto

Luchian Grigore Points 136646

Probablement pour la compatibilité avec les fonctions d'assistance. Par exemple:

 template<class T> T abs (const complex<T>& x);
 

Si T == int , abs renverraient int , ce qui entraînerait une perte de précision considérable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X