Ich glaube nicht, dass es einen bestimmten Formatbezeichner für den C99-Komplextyp gibt.
Ich könnte mich hier irren, aber da creal() und cimag() beide Doubles zurückgeben, sollte der Formatbezeichner nicht ‘%lf’ statt einfach ‘%f’ sein?
– Jon Doe
30. Juni 2015 um 17:06 Uhr
Zusätzliche Verbesserung – Makro, das auf Vorzeichen des Imaginärteils reagiert: #define printfc(c) printf("%f%c%fi",creal(c),(cimag(c)>=0.0f)? '+':'\0',cimag(c))
– Agnius Vasiliauskas
21. September 2015 um 19:02 Uhr
@ JonDoe Es spielt keine Rolle. printf ist nicht scanf, f und lf sind beide ok für double. Siehe stackoverflow.com/questions/210590/…
– ntysdd
9. Mai 2017 um 2:16 Uhr
@AgniusVasiliauskas Ist dir das bewusst? %c wird auch ausgegeben \0? Besser verwenden %s mit ? "+" : ""
– 12431234123412341234123
1. Juli 2021 um 18:39 Uhr
Lassen %+f Wählen Sie das für Sie richtige Zeichen für den Imaginärteil:
printf("%f%+fi\n", crealf(I), cimagf(I));
Ausgabe:
0.000000+1.000000i
Beachten Sie, dass i ist am ende.
Weil die komplexe Zahl als zwei reelle Zahlen Rücken an Rücken im Speicher gespeichert wird, tut es
printf("%g + i%g\n", result);
wird auch funktionieren, erzeugt aber Compiler-Warnungen mit gcc, weil der Typ und die Anzahl der Parameter nicht zum Format passen. Ich mache das zur Not beim Debuggen, aber nicht im Produktionscode.
Ich würde argumentieren, dass es eine schlechte Idee ist, sich beim Debuggen auf undefiniertes Verhalten zu verlassen. Undefiniertes Verhalten kann oft andere subtile Fehler verursachen, die das Problem verschlimmern. Außerdem kommt es allzu häufig vor, dass weggeworfener Debugging-Code in der Produktion landet.
– David Braun
22. November 2012 um 20:25 Uhr
Dies funktioniert nur, wenn die Aufrufkonventionen der Plattform vorgeben, dass komplexe Zahlen auf die gleiche Weise wie zwei reelle Zahlen übergeben werden, was in keiner Weise garantiert ist.
– Stefan Kanon
23. November 2012 um 1:57 Uhr
Es ist jedoch nur zum Debuggen ein ziemlich netter Hack. Vielen Dank für die Idee.
– Rhys Ulerich
13. Februar 2014 um 17:23 Uhr
Verwenden Sie derzeit einen Compiler mit _Complex, aber sonst nichts. Sicherere Verwendung des Back-to-Back in mem als solches: printf("%f%+fi\n", (double)D, *((double*)&D+1));
– dargaud
21. Januar 2020 um 15:23 Uhr
Mit GNU C funktioniert das:
printf("%f %f\n", complexnum);
Oder, wenn Sie ein Suffix von “i” nach dem Imaginärteil gedruckt haben möchten: