std:: complex
|
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) |
|
|
(C++26)
|
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) |
|
|
(C++11)
|
calcule l'arc sinus d'un nombre complexe (
arcsin(z)
)
(fonction template) |
|
(C++11)
|
calcule l'arc cosinus d'un nombre complexe (
arccos(z)
)
(modèle de fonction) |
|
(C++11)
|
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) |
|
|
(C++11)
|
calcule le sinus hyperbolique inverse d'un nombre complexe (
arsinh(z)
)
(modèle de fonction) |
|
(C++11)
|
calcule le cosinus hyperbolique inverse d'un nombre complexe (
arcosh(z)
)
(modèle de fonction) |
|
(C++11)
|
calcule la tangente hyperbolique inverse d'un nombre complexe (
artanh(z)
)
(modèle de fonction) |
Types auxiliaires
|
(C++26)
|
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
|