C komplexe Zahl und printf

Lesezeit: 2 Minuten

Benutzeravatar des Gameboys
Game Boy

Wie drucke ich (mit printf) eine komplexe Zahl? Wenn ich zum Beispiel diesen Code habe:

#include <stdio.h>
#include <complex.h>
int main(void)
{
    double complex dc1 = 3 + 2*I;
    double complex dc2 = 4 + 5*I;
    double complex result;

    result = dc1 + dc2;
    printf(" ??? \n", result);

    return 0;
}

..welche Konvertierungsspezifizierer ( oder etwas anderes ) sollte ich stattdessen verwenden “???”

printf("%f + i%f\n", creal(result), cimag(result));

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:

printf("%f %fi\n", complexnum);

1409430cookie-checkC komplexe Zahl und printf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy