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?
Réponses
Trop de publicités?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;
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));
}
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;
}