Namespaces
Variants

std:: complex

From cppreference.net
Défini dans l'en-tête <complex>
template < class T >
class complex ;
(1)
template <> class complex < float > ;
(2) (jusqu'à C++23)
template <> class complex < double > ;
(3) (jusqu'à C++23)
template <> class complex < long double > ;
(4) (jusqu'à C++23)

Spécialisations de std::complex pour les types standard (jusqu'en C++23) à virgule flottante non qualifiés cv sont des TriviallyCopyable (depuis C++23) LiteralType s pour représenter et manipuler les nombres complexes .

Table des matières

Paramètres du modèle

T - le type des parties réelle et imaginaire. Le comportement n'est pas spécifié (et peut échouer à la compilation) si T n'est pas un type à virgule flottante standard non qualifié cv standard (jusqu'en C++23) et indéfini si T n'est pas NumericType .

Types membres

Type de membre Définition
value_type T

Fonctions membres

construit un nombre complexe
(fonction membre publique)
assigne le contenu
(fonction membre publique)
accède à la partie réelle du nombre complexe
(fonction membre publique)
accède à la partie imaginaire du nombre complexe
(fonction membre publique)
assignation composée de deux nombres complexes ou d'un complexe et d'un scalaire
(fonction membre publique)

Fonctions non membres

applique les opérateurs unaires aux nombres complexes
(modèle de fonction)
effectue des opérations arithmétiques sur des nombres complexes entre deux valeurs complexes ou entre un complexe et un scalaire
(modèle de fonction)
(supprimé en C++20)
compare deux nombres complexes ou un complexe et un scalaire
(modèle de fonction)
sérialise et désérialise un nombre complexe
(modèle de fonction)
obtient une référence à la partie réelle ou imaginaire d'un std::complex
(modèle de fonction)
renvoie la partie réelle
(fonction template)
renvoie la partie imaginaire
(modèle de fonction)
renvoie la magnitude d'un nombre complexe
(modèle de fonction)
renvoie l'angle de phase
(fonction template)
retourne la magnitude au carré
(fonction template)
renvoie le conjugué complexe
(modèle de fonction)
(C++11)
retourne la projection sur la sphère de Riemann
(modèle de fonction)
construit un nombre complexe à partir de son module et de son angle de phase
(modèle de fonction)
Fonctions exponentielles
exponentielle complexe de base e
(modèle de fonction)
logarithme naturel complexe avec les coupures de branche le long de l'axe réel négatif
(modèle de fonction)
logarithme décimal complexe avec les coupures de branche le long de l'axe réel négatif
(modèle de fonction)
Fonctions de puissance
puissance complexe, un ou deux arguments peuvent être des nombres complexes
(modèle de fonction)
racine carrée complexe dans le demi-plan droit
(modèle de fonction)
Fonctions trigonométriques
calcule le sinus d'un nombre complexe ( sin(z) )
(modèle de fonction)
calcule le cosinus d'un nombre complexe ( cos(z) )
(modèle de fonction)
calcule la tangente d'un nombre complexe ( tan(z) )
(modèle de fonction)
calcule l'arc sinus d'un nombre complexe ( arcsin(z) )
(fonction template)
calcule l'arc cosinus d'un nombre complexe ( arccos(z) )
(modèle de fonction)
calcule l'arc tangente d'un nombre complexe ( arctan(z) )
(fonction template)
Fonctions hyperboliques
calcule le sinus hyperbolique d'un nombre complexe ( sinh(z) )
(modèle de fonction)
calcule le cosinus hyperbolique d'un nombre complexe ( cosh(z) )
(modèle de fonction)
calcule la tangente hyperbolique d'un nombre complexe ( tanh(z) )
(modèle de fonction)
calcule le sinus hyperbolique inverse d'un nombre complexe ( arsinh(z) )
(modèle de fonction)
calcule le cosinus hyperbolique inverse d'un nombre complexe ( arcosh(z) )
(modèle de fonction)
calcule la tangente hyperbolique inverse d'un nombre complexe ( artanh(z) )
(modèle de fonction)

Types auxiliaires

obtient la taille d'un std::complex
(spécialisation de modèle de classe)
obtient le type sous-jacent des nombres réels et imaginaires d'un std::complex
(spécialisation de modèle de classe)

Accès orienté tableau

Pour tout objet z de type std::complex<T> , reinterpret_cast < T ( & ) [ 2 ] > ( z ) [ 0 ] représente la partie réelle de z et reinterpret_cast < T ( & ) [ 2 ] > ( z ) [ 1 ] représente la partie imaginaire de z .

Pour tout pointeur vers un élément d'un tableau de std::complex<T> nommé p et tout index de tableau valide i , reinterpret_cast < T * > ( p ) [ 2 * i ] représente la partie réelle du nombre complexe p [ i ] , et reinterpret_cast < T * > ( p ) [ 2 * i + 1 ] représente la partie imaginaire du nombre complexe p [ i ] .

L'intention de cette exigence est de préserver la compatibilité binaire entre les types de nombres complexes de la bibliothèque C++ et les types de nombres complexes du langage C (et leurs tableaux), qui ont une exigence identique de représentation objet.

Notes d'implémentation

Afin de satisfaire les exigences d'accès orienté tableau, une implémentation est contrainte de stocker les parties réelle et imaginaire d'une std::complex spécialisation dans des emplacements mémoire séparés et adjacents. Les déclarations possibles pour ses membres de données non statiques incluent :

  • un tableau de type value_type[2] , le premier élément contenant la partie réelle et le second élément contenant la partie imaginaire (par exemple Microsoft Visual Studio) ;
  • un seul membre de type value_type _Complex (encapsulant le type de nombre complexe du langage C correspondant) (par exemple GNU libstdc++) ;
  • deux membres de type value_type , avec le même accès membre, contenant respectivement les parties réelle et imaginaire (par exemple LLVM libc++).

Une implémentation ne peut pas déclarer de membres de données non statiques supplémentaires qui occuperaient un stockage disjoint des parties réelle et imaginaire, et doit garantir que la spécialisation du modèle de classe ne contienne aucun bit de remplissage . L'implémentation doit également garantir que les optimisations d'accès aux tableaux prennent en compte la possibilité qu'un pointeur vers value_type puisse aliéner une spécialisation de std::complex ou un tableau de celles-ci.

Littéraux

Défini dans l'espace de noms en ligne std::literals::complex_literals
un littéral std::complex représentant un nombre purement imaginaire
(fonction)

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_constexpr_complex 201711L (C++20) constexpr fonctions mathématiques simples pour les nombres complexes dans <complex>
202306L (C++26) Davantage de constexpr pour <complex>
__cpp_lib_tuple_like 202311L (C++26) Ajouter le protocole tuple à std::complex

Exemple

#include <cmath>
#include <complex>
#include <iomanip>
#include <iostream>
#include <ranges>
int main()
{
    using namespace std::complex_literals;
    std::cout << std::fixed << std::setprecision(1);
    std::complex<double> z1 = 1i * 1i; // unité imaginaire au carré
    std::cout << "i * i = " << z1 << '\n';
    std::complex<double> z2 = std::pow(1i, 2); // unité imaginaire au carré
    std::cout << "pow(i, 2) = " << z2 << '\n';
    const double PI = std::acos(-1); // ou std::numbers::pi en C++20
    std::complex<double> z3 = std::exp(1i * PI); // formule d'Euler
    std::cout << "exp(i * pi) = " << z3 << '\n';
    std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // conjugués
    std::cout << "(1 + 2i) * (1 - 2i) = " << z4 * z5 << '\n';
    const auto zz = {0.0 + 1i, 2.0 + 3i, 4.0 + 5i};
#if __cpp_lib_tuple_like >= 202311L
    for (double re : zz | std::views::keys)
        std::cout << re << ' ';
    std::cout << '\n';
    for (double im : zz | std::views::values)
        std::cout << im << ' ';
    std::cout << '\n';
#else
    for (double re : zz | std::views::transform([](auto z){ return z.real(); }))
        std::cout << re << ' ';
    std::cout << '\n';
    for (double im : zz | std::views::transform([](auto z){ return z.imag(); }))
        std::cout << im << ' ';
    std::cout << '\n';
#endif
}

Sortie :

i * i = (-1.0,0.0)
pow(i, 2) = (-1.0,0.0)
exp(i * pi) = (-1.0,0.0)
(1 + 2i) * (1 - 2i) = (5.0,0.0)
0.0 2.0 4.0
1.0 3.0 5.0

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 387 C++98 std::complex n'était pas garanti d'être compatible avec C complex garanti d'être compatible

Voir aussi

Documentation C pour Arithmétique des nombres complexes