2010-11-04 6 views
37

Come stampare (con printf) il numero complesso? Per esempio, se ho questo codice:Numero complesso C e 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; 
} 

..quello indicatori di conversione (o qualcos'altro) dovrei usare invece "???"

risposta

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

Non credo ci sia uno specifico specificatore di formato per il tipo di complesso C99.

+0

Vedo, grazie per l'aiuto – gameboy

+0

Qui potrei sbagliarmi, ma poiché creal() e cimag() restituiscono entrambi i doppi, l'identificatore di formato non dovrebbe essere '% lf' invece di semplicemente '% f'? –

+2

Miglioramento aggiuntivo - macro che reagisce al segno della parte immaginaria: '#finefcf printfc (c) printf ("% f% c% fi ", creal (c), (cimag (c)> = 0.0f)? '+ ':' \ 0 ', cimag (c)) ' –

-1

Poiché il numero complesso viene memorizzato come due numeri reali back-to-back in memoria, facendo

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

funzionerà pure, ma genera avvisi del compilatore con gcc perché il tipo e il numero di parametri doesn' t corrisponde al formato. Lo faccio in un pizzico durante il debug ma non lo faccio nel codice di produzione.

+1

Direi che fare affidamento su un comportamento non definito quando il debug è una cattiva idea. Un comportamento indefinito può spesso causare altri bug sottili, aggravando il problema. Inoltre, è fin troppo comune che il codice di debug throwaway finisca in produzione. –

+2

Funzionerà solo se le convenzioni di chiamata della piattaforma specificano che i numeri complessi vengono passati allo stesso modo di due numeri reali, il che non è in alcun modo garantito. –

+2

È, tuttavia, solo per il debug, un bel trucco. Grazie per l'idea. –

3

Lasciatevi %+f scelgono il segno corretto per voi per la parte immaginaria:

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

uscita:

0.000000+1.000000i 

noti che i è alla fine.