Wie kann ich mit komplexen Zahlen in C arbeiten? Ich sehe, dass es eine complex.h
Header-Datei gibt, aber sie gibt mir nicht viele Informationen darüber, wie man sie verwendet. Wie kann man effizient auf Real- und Imaginärteile zugreifen? Gibt es native Funktionen, um Modul und Phase abzurufen?
c
complex-numbers
Charles Brunet
quelle
quelle
Antworten:
Dieser Code hilft Ihnen und ist ziemlich selbsterklärend:
mit:
creal(z1)
: Holen Sie sich den Realteil (für Floatcrealf(z1)
, für Long Doublecreall(z1)
)cimag(z1)
: Holen Sie sich den Imaginärteil (für Floatcimagf(z1)
, für Long Doublecimagl(z1)
)Ein weiterer wichtiger Punkt zu erinnern , wenn mit komplexen Zahlen arbeiten , ist , dass Funktionen wie
cos()
,exp()
undsqrt()
müssen mit ihren komplexen Formen ersetzt werden, zum Beispielccos()
,cexp()
,csqrt()
.quelle
double complex
? Ist das eine Spracherweiterung oder eine Makromagie?complex
ist ein Standard-c99-Typ (unter der Haube von GCC ist es tatsächlich ein Alias für den _Complex-Typ).complex
ist kein Typ. Es ist ein Makro , das sich ausdehnt auf_Complex
, die eine Art ist Spezifizierer , aber nicht eine Art von selbst aus . Die komplexen Typen sindfloat _Complex
,double _Complex
undlong double _Complex
.Komplexe Typen sind seit dem C99-Standard in der Sprache C (
-std=c99
Option von GCC). Einige Compiler implementieren möglicherweise komplexe Typen auch in früheren Modi, dies ist jedoch eine nicht standardmäßige und nicht portable Erweiterung (z. B. IBM XL, GCC, möglicherweise Intel, ...).Sie können von http://en.wikipedia.org/wiki/Complex.h ausgehen - es enthält eine Beschreibung der Funktionen von complex.h
Dieses Handbuch http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html enthält auch einige Informationen zu Makros.
Verwenden Sie, um eine komplexe Variable zu deklarieren
oder
Verwenden Sie ein
_Complex_I
Makro auscomplex.h
:(
(0,-0i)
Tatsächlich kann es hier einige Probleme mit Zahlen und NaNs in einer Hälfte des Komplexes geben.)Modul ist
cabs(a)
/cabsl(c)
/cabsf(b)
; Realteil istcreal(a)
, imaginär istcimag(a)
.carg(a)
ist für komplexe Argumente.Um direkt auf ein Bildteil zuzugreifen (lesen / schreiben), können Sie diese nicht portierbare GCC-Erweiterung verwenden :
quelle
(complex float) { r, i }
kann auch verwendet werden, um die einzelnen Teile der Zahl unabhängig voneinander festzulegen (so dass der Realteil INF sein kann, während der Imaginärteil beispielsweise NAN ist). Dadurch wird das GCC-spezifische Schlüsselwort vermieden, obwohl ich nicht sicher bin, ob es tatsächlich portabel ist.__STDC_NO_COMPLEX__
. In der Praxis ist es jedoch auf großen Compilern implementiert.complex
wird es als Makro definiert und auf erweitert_Complex
. Vielleicht interessiert Sie auch Derek M. Jones '"Der neue C-Standard: Ein wirtschaftlicher und kultureller Kommentar" (2008) Seite 500 "Komplexe Typen" people.ece.cornell.edu/land/courses/ece4760/…Complex.h
quelle
Der Einfachheit halber kann man eine
tgmath.h
Bibliothek für die Typgenerierungsmakros einschließen . Es wird für alle Variablentypen der gleiche Funktionsname wie für die Doppelversion erstellt. Zum Beispiel Zum Beispiel definiert es einensqrt()
Makro , das auf das erweitertsqrtf()
,sqrt()
odersqrtl()
Funktion, abhängig von der Art des Arguments vorgesehen.Man muss sich also nicht den entsprechenden Funktionsnamen für verschiedene Variablentypen merken!
quelle
Der Begriff der komplexen Zahlen wurde in der Mathematik eingeführt, da negative quadratische Wurzeln berechnet werden mussten. Das komplexe Zahlenkonzept wurde von einer Vielzahl von technischen Bereichen übernommen.
Heutzutage werden komplexe Zahlen in fortgeschrittenen technischen Bereichen wie Physik, Elektronik, Mechanik, Astronomie usw. häufig verwendet.
Real- und Imaginärteil eines negativen Quadratwurzelbeispiels:
quelle
z
Verwenden Sie die Notation as, um den Realteil eines Ausdrucks mit komplexem Wert zu extrahieren__real__ z
. Verwenden Sie in ähnlicher Weise das__imag__
Attribut onz
, um den Imaginärteil zu extrahieren.Beispielsweise;
r ist der Realteil der komplexen Zahl "z" i ist der Imaginärteil der komplexen Zahl "z"
quelle