Namespaces
Variants

std:: complex

From cppreference.net
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)
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)
calcula el arco seno de un número complejo ( arcsin(z) )
(plantilla de función)
calcula el arco coseno de un número complejo ( arccos(z) )
(plantilla de función)
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)
calcula el seno hiperbólico área de un número complejo ( arsinh(z) )
(plantilla de función)
calcula el coseno hiperbólico del área de un número complejo ( arcosh(z) )
(plantilla de función)
calcula la tangente hiperbólica de área de un número complejo ( artanh(z) )
(plantilla de función)

Tipos auxiliares

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