Comment puis-je travailler avec des nombres complexes en C? Je vois qu'il y a un complex.h
fichier d'en-tête, mais il ne me donne pas beaucoup d'informations sur la façon de l'utiliser. Comment accéder de manière efficace aux parties réelles et imaginaires? Existe-t-il des fonctions natives pour obtenir le module et la phase?
c
complex-numbers
Charles Brunet
la source
la source
Réponses:
Ce code vous aidera, et il est assez explicite:
avec:
creal(z1)
: obtenir la vraie partie (pour floatcrealf(z1)
, pour long doublecreall(z1)
)cimag(z1)
: récupère la partie imaginaire (pour floatcimagf(z1)
, pour long doublecimagl(z1)
)Un autre point important à retenir lorsque l'on travaille avec des nombres complexes est que des fonctions comme
cos()
,exp()
etsqrt()
doit être remplacé par leurs formes complexes, par exempleccos()
,cexp()
,csqrt()
.la source
double complex
? Est-ce une extension de langage ou une magie macro?complex
est un type c99 standard (sous le capot sur GCC, c'est en fait un alias du type _Complex).complex
n'est pas un type. C'est une macro qui se développe en_Complex
, qui est un spécificateur de type , mais pas un type en soi. Les types complexes sontfloat _Complex
,double _Complex
etlong double _Complex
.Les types complexes sont en langage C depuis le standard C99 (
-std=c99
option de GCC). Certains compilateurs peuvent implémenter des types complexes même dans des modes plus anciens, mais il s'agit d'une extension non standard et non portable (par exemple IBM XL, GCC, peut être Intel, ...).Vous pouvez commencer à partir de http://en.wikipedia.org/wiki/Complex.h - il donne une description des fonctions de complex.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, utilisez
ou
Pour donner une valeur en complexe, utilisez la
_Complex_I
macro decomplex.h
:(en fait, il peut y avoir des problèmes ici avec les
(0,-0i)
nombres et les NaN dans une seule moitié du complexe)Le module est
cabs(a)
/cabsl(c)
/cabsf(b)
; La vraie partie estcreal(a)
, imaginaire estcimag(a)
.carg(a)
est pour un argument complexe.Pour accéder directement (lecture / écriture) à une partie imag réelle, vous pouvez utiliser cette extension GCC non portable :
la source
(complex float) { r, i }
peut également être utilisée pour définir les parties séparées du nombre et indépendamment (permettant à la partie réelle d'être INF alors que la partie imaginaire est NAN, par exemple). Cela évite le mot-clé spécifique à GCC, même si je ne suis pas sûr qu'il soit réellement portable.__STDC_NO_COMPLEX__
. En pratique cependant, il est implémenté sur les principaux compilateurs.complex
sera défini comme macro, développé en_Complex
. Vous pourriez également être intéressé par "The New C Standard: An Economic and Cultural Commentary" (2008) page 500 "types complexes" people.ece.cornell.edu/land/courses/ece4760/…Complex.h
la source
Pour plus de commodité, on peut inclure une
tgmath.h
bibliothèque pour le type générer des macros. Il crée le même nom de fonction que la version double pour tous les types de variables. Par exemple, Par exemple, on définit unesqrt()
macro qui se dilate à lasqrtf()
,sqrt()
ousqrtl()
fonction, selon le type d'argument fourni.Il n'est donc pas nécessaire de se souvenir du nom de la fonction correspondante pour différents types de variables!
la source
La notion de nombres complexes a été introduite en mathématiques, à partir de la nécessité de calculer des racines quadratiques négatives. Le concept de nombre complexe a été adopté par une variété de domaines de l'ingénierie.
Aujourd'hui, les 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:
la source
Pour extraire la partie réelle d'une expression à valeurs complexes
z
, utilisez la notation comme__real__ z
. De même, utilisez l'__imag__
attribut surz
pour extraire la partie imaginaire.Par exemple;
r est la partie réelle du nombre complexe "z" i est la partie imaginaire du nombre complexe "z"
la source