2010-11-04 24 views
37

Comment imprimer (avec printf) nombre complexe? Par exemple, si j'ai ce code:C nombre complexe et printf

#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; 
} 

..Qu'est spécificateurs de conversion (ou autre chose) dois-je utiliser à la place « ??? »

Répondre

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

Je ne crois pas qu'il existe un spécificateur de format spécifique pour le type complexe C99.

+0

Je vois, je vous remercie pour l'aide – gameboy

+0

Je peux me tromper ici, mais comme creal() et cimag() renvoient tous les deux doubles, le spécificateur de format ne devrait-il pas être '% lf' au lieu de simplement '% f'? –

+2

Amélioration supplémentaire - macro qui réagit au signe d'une partie imaginaire: '#define printfc (c) printf ("% f% c% fi ", creal (c), (cimag (c)> = 0.0f)? '+ ':' \ 0 ', cimag (c)) ' –

-1

Parce que le nombre complexe est stocké sous forme de deux nombres réels dos à dos dans la mémoire, faisant

printf("%g + i%g\n", result); 

fonctionnera aussi bien, mais génère des avertissements du compilateur gcc parce que le type et le nombre de paramètres n » t correspond au format. Je fais cela à la rigueur lors du débogage mais je ne le fais pas en code de production.

+1

Je dirais que s'appuyer sur un comportement indéfini quand le débogage est une mauvaise idée. Un comportement indéfini peut souvent causer d'autres bogues subtils, exacerbant le problème. De plus, il est trop courant que le code de débogage jetable finisse en production. –

+2

Cela ne fonctionnera que si les conventions d'appel de la plateforme spécifient que les nombres complexes sont transmis de la même manière que deux nombres réels, ce qui n'est nullement garanti. –

+2

Il est, cependant, pour le débogage seulement, un hack assez sympa. Merci pour l'idée. –

3

Laissez-%+f choisir le bon signe pour vous pour une partie imaginaire:

printf("%f%+fi\n", crealf(I), cimagf(I)); 

Sortie:

0.000000+1.000000i 

Notez que i est à la fin.