Saltar al contenido

¿Cómo trabajar con números complejos en C?

Recuerda que en la informática cualquier problema casi siempere puede tener más de una soluciones, por lo tanto nosotros aquí mostramos lo más óptimo y eficiente.

Solución:

Este código te ayudará y es bastante autoexplicativo:

#include       /* Standard Library of Input and Output */
#include     /* Standard Library of Complex Numbers */

int main() 

    double complex z1 = 1.0 + 3.0 * I;
    double complex z2 = 1.0 - 4.0 * I;

    printf("Working with complex numbers:nv");

    printf("Starting values: Z1 = %.2f + %.2fitZ2 = %.2f %+.2fin", creal(z1), cimag(z1), creal(z2), cimag(z2));

    double complex sum = z1 + z2;
    printf("The sum: Z1 + Z2 = %.2f %+.2fin", creal(sum), cimag(sum));

    double complex difference = z1 - z2;
    printf("The difference: Z1 - Z2 = %.2f %+.2fin", creal(difference), cimag(difference));

    double complex product = z1 * z2;
    printf("The product: Z1 x Z2 = %.2f %+.2fin", creal(product), cimag(product));

    double complex quotient = z1 / z2;
    printf("The quotient: Z1 / Z2 = %.2f %+.2fin", creal(quotient), cimag(quotient));

    double complex conjugate = conj(z1);
    printf("The conjugate of Z1 = %.2f %+.2fin", creal(conjugate), cimag(conjugate));

    return 0;

con:

creal(z1): obtener la parte real (para flotar crealf(z1), para doble largo creall(z1))

cimag(z1): obtener la parte imaginaria (para flotar cimagf(z1), para doble largo cimagl(z1))

Otro punto importante para recordar cuando se trabaja con números complejos es que funciona como cos(), exp() y sqrt() deben ser reemplazados con sus formas complejas, p. ej. ccos(), cexp(), csqrt().

Los tipos complejos están en lenguaje C desde el estándar C99 (-std=c99 opción de GCC). Algunos compiladores pueden implementar tipos complejos incluso en modos más anteriores, pero esta es una extensión no estándar y no portátil (por ejemplo, IBM XL, GCC, puede ser Intel, …).

Puede comenzar desde http://en.wikipedia.org/wiki/Complex.h: proporciona una descripción de las funciones de complex.h

Este manual http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html también brinda información sobre macros.

Para declarar una variable compleja, use

  double _Complex  a;        // use c* functions without suffix

o

  float _Complex   b;        // use c*f functions - with f suffix
  long double _Complex c;    // use c*l functions - with l suffix

Para dar un valor en complejo, use _Complex_I macro desde complex.h:

  float _Complex d = 2.0f + 2.0f*_Complex_I;

(de hecho, puede haber algunos problemas aquí con (0,-0i) números y NaN en la mitad única del complejo)

El módulo es cabs(a)/cabsl(c)/cabsf(b); La parte real es creal(a), Imaginario es cimag(a). carg(a) es para argumentos complejos.

Para acceder directamente (lectura / escritura) real a una parte imag, puede usar este inportable Extensión GCC:

 __real__ a = 1.4;
 __imag__ a = 2.0;
 float b = __real__ a;

Por conveniencia, uno puede incluir tgmath.h biblioteca para el tipo generar macros. Crea el mismo nombre de función que la versión doble para todo tipo de variable. Por ejemplo, por ejemplo, define un sqrt() macro que se expande a la sqrtf() , sqrt() , o sqrtl() función, dependiendo del tipo de argumento proporcionado.

¡Así que no es necesario recordar el nombre de la función correspondiente para diferentes tipos de variables!

#include 
#include //for the type generate macros. 
#include //for easier declare complex variables and complex unit I

int main(void)

    double complex z1=1./4.*M_PI+1./4.*M_PI*I;//M_PI is just pi=3.1415...
    double complex z2, z3, z4, z5; 

    z2=exp(z1);
    z3=sin(z1);
    z4=sqrt(z1);
    z5=log(z1);

    printf("exp(z1)=%lf + %lf In", creal(z2),cimag(z2));
    printf("sin(z1)=%lf + %lf In", creal(z3),cimag(z3));
    printf("sqrt(z1)=%lf + %lf In", creal(z4),cimag(z4));
    printf("log(z1)=%lf + %lf In", creal(z5),cimag(z5));

    return 0;

valoraciones y comentarios

Más adelante puedes encontrar los comentarios de otros gestores de proyectos, tú igualmente tienes la libertad de dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *