Ich arbeite nicht mit _Complex Zahlen. Nach einigem Lesen im Standard und dem bereitgestellten Link denke ich, dass die Antwort von @iharob richtig ist.
– zu ehrlich für diese Seite
3. Februar 2016 um 17:37 Uhr
@Olaf Die schnellste Fourier-Transformation im Westen fftw nutzt die _Complex Typ. Das habe ich beim Schreiben einer Datenverarbeitungssoftware für meine Diplomarbeit herausgefunden (Eigentlich Physik, nicht Informatik oder ähnliches) – (Ich musste einen Tiefpassfilter anwenden, also Faltung, also schnelle Fourier-Transformation, also fftw).
– Iharob Al Asimi
3. Februar 2016 um 17:41 Uhr
@iharob: Hmm, ist das schneller als die ffte und wenn nicht, darf ich die schnellere benutzen, wenn ich im Westen wohne, aber östlich von dir? 😉 Im Ernst: Danke für die Info. Wie es aussieht, unterstützt der C-Standard nicht einmal eine ähnlich einfache Notation mit C11.
– zu ehrlich für diese Seite
3. Februar 2016 um 17:48 Uhr
Ein sehr gutes Beispiel für “.. nicht ‘Heureka’ sondern ‘Das ist lustig…'”!
– Jongware
3. Februar 2016 um 18:47 Uhr
Iharob Al-Asimi
Das ist ein gcc Verlängerungund 2i ist die imaginäre Konstante . Sie können also eine komplexe Zahl wie folgt schreiben:
#include <complex.h>
_Complex x = 4 + 5i;
Wow, das kam überraschend! Können Sie mir sagen, warum es funktioniert hat, auch wenn ich die Header-Datei complex.h nicht eingefügt habe?
– daltonfury42
3. Februar 2016 um 17:39 Uhr
@daltonfury42 Der Header ist für die _Complex Typ, 2i ist eine Konstante (wie gcc es versteht). Ergänzen Sie die std=c99 oder std=c11 Flagge kombiniert mit -Wall und du wirst eine Warnung sehen. Auch tatsächlich kehrt es nicht zurück 0 aber da sollte der Rückgabetyp sein _Complex und der Wert 0 + 2ikönnen Sie es nicht mit untersuchen printf(). Also vielleicht ist das genau das real Teil 0!
– Iharob Al Asimi
3. Februar 2016 um 17:40 Uhr
@daltonfury42: Das musst du nicht #include <float.h> (oder math.h), um Unterstützung zu erhalten Gleitkommakonstanten entweder.
– zu ehrlich für diese Seite
3. Februar 2016 um 17:45 Uhr
@daltonfury42 Das stimmt. Header-Dateien ändern die Sprachsyntax nicht, sie deklarieren nur Dinge wie Variablen, Funktionen, Typen usw.
– Barmar
3. Februar 2016 um 17:54 Uhr
@ daltonfury42 Obwohl es möglich gewesen wäre, die Erkennung dieser Syntax durch a #pragmadie complex.h ausstellen könnte. Aber sie haben es nicht so gemacht.
– Barmar
3. Februar 2016 um 17:55 Uhr
chqrlie
2i ist ein gcc Erweiterung für ein komplexes Integer-Literal, eine reine imaginäre Zahl, die das Doppelte der Quadratwurzel von ist -1. Diese Erweiterung wird unterstützt von clang auch.
Es ist etwas überraschend, dass Ihre Kompilierung mit gcc 5.4.0 erzeugt die gepostete Assembly-Ausgabe:
Kompilieren weiter http://gcc.godbolt.org/# Ich erhalte einen Kompilierungsfehler von gcc 5.3.0: http://gcc.godbolt.org/#: error: cannot convert '__complex__ int' to 'int' in return.
Der gepostete Assemblycode für die Funktion foo ist falsch: es kehrt nicht zurück 0. Konvertieren der komplexen ganzzahligen Konstante 2i zu int sollte seinen Realteil zurückgeben 0.
Umgekehrt mit clang 3.7 kompiliert es ohne Warnung und generiert optimalen Code, aber natürlich nicht das, was Sie erwarten:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Diese Syntax kann in beliebiger Reihenfolge mit anderen Suffixen kombiniert werden. Kompilieren Sie den folgenden Code mit clang -Weverything gibt mir entsprechende Warnungen warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]:
Probieren Sie den letzten mit Ihrem Syntaxhervorhebungseditor aus ;-)
Nun, das habe ich bekommen, als ich GCC 5.3.0 auf meinem PC mit Arch Linux verwendet habe. Hier ist meine gcc-konfiguration, falls es dich interessiert.
– daltonfury42
4. Februar 2016 um 12:11 Uhr
14186500cookie-checkWarum bedeutet die Aussage “2i;” KEINEN Compilerfehler verursachen?yes
Welcher Compiler ist das?
– Iharob Al Asimi
3. Februar 2016 um 17:28 Uhr
Ich arbeite nicht mit
_Complex
Zahlen. Nach einigem Lesen im Standard und dem bereitgestellten Link denke ich, dass die Antwort von @iharob richtig ist.– zu ehrlich für diese Seite
3. Februar 2016 um 17:37 Uhr
@Olaf Die schnellste Fourier-Transformation im Westen fftw nutzt die
_Complex
Typ. Das habe ich beim Schreiben einer Datenverarbeitungssoftware für meine Diplomarbeit herausgefunden (Eigentlich Physik, nicht Informatik oder ähnliches) – (Ich musste einen Tiefpassfilter anwenden, also Faltung, also schnelle Fourier-Transformation, also fftw).– Iharob Al Asimi
3. Februar 2016 um 17:41 Uhr
@iharob: Hmm, ist das schneller als die ffte und wenn nicht, darf ich die schnellere benutzen, wenn ich im Westen wohne, aber östlich von dir? 😉 Im Ernst: Danke für die Info. Wie es aussieht, unterstützt der C-Standard nicht einmal eine ähnlich einfache Notation mit C11.
– zu ehrlich für diese Seite
3. Februar 2016 um 17:48 Uhr
Ein sehr gutes Beispiel für “.. nicht ‘Heureka’ sondern ‘Das ist lustig…'”!
– Jongware
3. Februar 2016 um 18:47 Uhr