std:: complex
|
Definido en el encabezado
<complex>
|
||
|
template
<
class
T
>
class complex ; |
(1) | |
|
template
<>
class
complex
<
float
>
;
|
(2) | (hasta C++23) |
|
template
<>
class
complex
<
double
>
;
|
(3) | (hasta C++23) |
|
template
<>
class
complex
<
long
double
>
;
|
(4) | (hasta C++23) |
Especializaciones de
std::complex
para tipos de
punto flotante
estándar (hasta C++23)
sin calificación cv
son
TriviallyCopyable
(desde C++23)
LiteralType
s
para representar y manipular
números complejos
.
Contenidos |
Parámetros de plantilla
| T | - |
el tipo de las partes real e imaginaria. El comportamiento no está especificado (y puede fallar al compilar) si
T
no es un tipo de punto flotante
estándar
(hasta C++23)
sin calificadores cv y es indefinido si
T
no es
NumericType
.
|
Tipos de miembros
| Tipo de miembro | Definición |
value_type
|
T
|
Funciones miembro
|
construye un número complejo
(función miembro pública) |
|
|
asigna los contenidos
(función miembro pública) |
|
|
accede a la parte real del número complejo
(función miembro pública) |
|
|
accede a la parte imaginaria del número complejo
(función miembro pública) |
|
|
asignación compuesta de dos números complejos o un complejo y un escalar
(función miembro pública) |
Funciones no miembro
|
aplica operadores unarios a números complejos
(plantilla de función) |
|
|
realiza operaciones aritméticas con números complejos sobre dos valores complejos o un complejo y un escalar
(plantilla de función) |
|
|
(removed in C++20)
|
compara dos números complejos o un complejo y un escalar
(function template) |
|
serializa y deserializa un número complejo
(plantilla de función) |
|
|
(C++26)
|
obtiene una referencia a la parte real o imaginaria de un
std::complex
(plantilla de función) |
|
devuelve la parte real
(plantilla de función) |
|
|
devuelve la parte imaginaria
(plantilla de función) |
|
|
devuelve la magnitud de un número complejo
(plantilla de función) |
|
|
devuelve el ángulo de fase
(plantilla de función) |
|
|
devuelve la magnitud al cuadrado
(plantilla de función) |
|
|
devuelve el conjugado complejo
(plantilla de función) |
|
|
(C++11)
|
devuelve la proyección sobre la esfera de Riemann
(plantilla de función) |
|
construye un número complejo a partir de magnitud y ángulo de fase
(plantilla de función) |
|
Funciones exponenciales |
|
|
exponencial compleja de base
e
(plantilla de función) |
|
|
logaritmo natural complejo con los cortes de rama a lo largo del eje real negativo
(plantilla de función) |
|
|
logaritmo común complejo con los cortes de rama a lo largo del eje real negativo
(plantilla de función) |
|
Funciones de potencia |
|
|
potencia compleja, uno o ambos argumentos pueden ser un número complejo
(plantilla de función) |
|
|
raíz cuadrada compleja en el rango del semiplano derecho
(plantilla de función) |
|
Funciones trigonométricas |
|
|
calcula el seno de un número complejo (
sin(z)
)
(plantilla de función) |
|
|
calcula el coseno de un número complejo (
cos(z)
)
(plantilla de función) |
|
|
calcula la tangente de un número complejo (
tan(z)
)
(plantilla de función) |
|
|
(C++11)
|
calcula el arco seno de un número complejo (
arcsin(z)
)
(plantilla de función) |
|
(C++11)
|
calcula el arco coseno de un número complejo (
arccos(z)
)
(plantilla de función) |
|
(C++11)
|
calcula el arcotangente de un número complejo (
arctan(z)
)
(plantilla de función) |
Funciones hiperbólicas |
|
|
calcula el seno hiperbólico de un número complejo (
sinh(z)
)
(plantilla de función) |
|
|
calcula el coseno hiperbólico de un número complejo (
cosh(z)
)
(plantilla de función) |
|
|
calcula la tangente hiperbólica de un número complejo (
tanh(z)
)
(plantilla de función) |
|
|
(C++11)
|
calcula el seno hiperbólico área de un número complejo (
arsinh(z)
)
(plantilla de función) |
|
(C++11)
|
calcula el coseno hiperbólico del área de un número complejo (
arcosh(z)
)
(plantilla de función) |
|
(C++11)
|
calcula la tangente hiperbólica de área de un número complejo (
artanh(z)
)
(plantilla de función) |
Tipos auxiliares
|
(C++26)
|
obtiene el tamaño de un
std::complex
(especialización de plantilla de clase) |
|
obtiene el tipo subyacente de número real e imaginario de un
std::complex
(especialización de plantilla de clase) |
Acceso orientado a arreglos
Para cualquier objeto
z
de tipo
std::complex<T>
,
reinterpret_cast
<
T
(
&
)
[
2
]
>
(
z
)
[
0
]
es la parte real de
z
y
reinterpret_cast
<
T
(
&
)
[
2
]
>
(
z
)
[
1
]
es la parte imaginaria de
z
.
Para cualquier puntero a un elemento de un arreglo de
std::complex<T>
denominado
p
y cualquier índice válido del arreglo
i
,
reinterpret_cast
<
T
*
>
(
p
)
[
2
*
i
]
es la parte real del número complejo
p
[
i
]
, y
reinterpret_cast
<
T
*
>
(
p
)
[
2
*
i
+
1
]
es la parte imaginaria del número complejo
p
[
i
]
.
La intención de este requisito es preservar la compatibilidad binaria entre los tipos de números complejos de la biblioteca C++ y los tipos de números complejos del lenguaje C (y sus arreglos), los cuales tienen un requisito de representación de objeto idéntico.
Notas de implementación
Para satisfacer los requisitos de acceso orientado a arreglos, una implementación está obligada a almacenar las partes real e imaginaria de una
std::complex
especialización en ubicaciones de memoria separadas y adyacentes. Las posibles declaraciones para sus miembros de datos no estáticos incluyen:
-
un arreglo de tipo
value_type[2], con el primer elemento conteniendo la parte real y el segundo elemento conteniendo la parte imaginaria (ej. Microsoft Visual Studio); -
un único miembro de tipo
value_type _Complex(encapsulando el correspondiente tipo de número complejo del lenguaje C ) (ej. GNU libstdc++); -
dos miembros de tipo
value_type, con el mismo acceso a miembro, conteniendo las partes real e imaginaria respectivamente (ej. LLVM libc++).
Una implementación no puede declarar miembros de datos no estáticos adicionales que ocuparían almacenamiento disjunto de las partes real e imaginaria, y debe asegurar que la especialización de la plantilla de clase no contenga ningún
bit de relleno
. La implementación también debe asegurar que las optimizaciones al acceso de arrays tengan en cuenta la posibilidad de que un puntero a
value_type
pueda estar aliasing una especialización de
std::complex
o un array de los mismos.
Literales
|
Definido en el espacio de nombres en línea
std::literals::complex_literals
|
|
|
un literal
std::complex
que representa un número puramente imaginario
(función) |
|
Notas
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_constexpr_complex
|
201711L
|
(C++20) | constexpr funciones matemáticas simples de números complejos en <complex> |
202306L
|
(C++26) | Más constexpr para <complex> | |
__cpp_lib_tuple_like
|
202311L
|
(C++26) |
Añadir protocolo de tupla a
std::complex
|
Ejemplo
#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; // unidad imaginaria al cuadrado std::cout << "i * i = " << z1 << '\n'; std::complex<double> z2 = std::pow(1i, 2); // unidad imaginaria al cuadrado std::cout << "pow(i, 2) = " << z2 << '\n'; const double PI = std::acos(-1); // o std::numbers::pi en C++20 std::complex<double> z3 = std::exp(1i * PI); // fórmula de Euler std::cout << "exp(i * pi) = " << z3 << '\n'; std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // conjugados 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 }
Salida:
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
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 387 | C++98 |
std::complex
no estaba garantizado ser compatible con C
complex
|
garantizado ser compatible |
Véase también
|
Documentación de C
para
Aritmética de números complejos
|