129 votes

Comment travailler avec des nombres complexes en C?

Comment puis-je travailler avec des nombres complexes en C? Je vois qu'il existe un fichier d'en-tête complex.h , mais il ne me donne pas beaucoup d'informations sur son utilisation. Comment accéder aux parties réelles et imaginaires de manière efficace? Existe-t-il des fonctions natives pour obtenir le module et la phase?

41voto

osgx Points 28675

Les types complexes sont dans le langage C depuis la norme C99 (-std=c99 option de GCC). Certains compilateurs peuvent mettre en œuvre des types complexes, même dans plusieurs modes, mais c'est non standard et non-portable extension (par exemple, IBM XL, GCC, peut-être d'intel,... ).

Vous pouvez commencer à partir de http://en.wikipedia.org/wiki/Complex.h - il donne une description des fonctions complexes.h

Ce manuel http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html donne également des informations sur les macros.

Pour déclarer une variable complexe, l'utilisation

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

ou

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

Afin de donner une valeur plus complexes, utilisez _Complex_I macro à partir d' complex.h:

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

(en fait, il peut y avoir quelques problèmes ici avec (0,-0i) de chiffres et de NaNs seule la moitié du complexe)

Le Module est - cabs(a)/cabsl(c)/cabsf(b); la partie Réelle est - creal(a), l'Imaginaire est cimag(a). carg(a) est complexe, argument.

Directement accès (lecture/écriture) réel d'une imag partie vous pouvez utiliser ce portables GCC-extension:

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

9voto

complex Points 51

Complex.h

#include <stdio.h>      /* Standard Library of Input and Output */
#include <complex.h>    /* Standart 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:\n\v");

    printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", 
           creal(z1), 
           cimag(z1), 
           creal(z2), 
           cimag(z2));

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

3voto

LXSoft Points 61

La notion de nombre complexe a été introduite en mathématiques, à partir du besoin de calculer des racines quadratiques négatives. Le concept de nombre complexe a été adopté par une variété de domaines d'ingénierie.

Aujourd'hui, ces nombres complexes sont largement utilisés dans des domaines d'ingénierie avancés tels que la physique, l'électronique, la mécanique, l'astronomie, etc.

Partie réelle et imaginaire d'un exemple de racine carrée négative:

 #include <stdio.h>   
#include <complex.h>

int main() 
{
    int negNum;

    printf("Calculate negative square roots:\n"
           "Enter negative number:");

    scanf("%d", &negNum);

    double complex negSqrt = csqrt(negNum);

    double pReal = creal(negSqrt);
    double pImag = cimag(negSqrt);

    printf("\nReal part %f, imaginary part %f"
           ", for negative square root.(%d)",
           pReal, pImag, negNum);

    return 0;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X