2010-11-04 20 views
37

Cómo imprimir (con printf) número complejo? Por ejemplo, si tengo este código:C número complejo 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; 
} 

..what especificadores de conversión (o algo más) debería usar en su lugar "???"

Respuesta

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

No creo que haya un especificador de formato específico para el tipo complejo C99.

+0

Veo, gracias por la ayuda – gameboy

+0

Podría estar mal aquí, pero como creal() y cimag() ambos devuelven dobles, ¿no debería el especificador de formato ser '% lf' en lugar de simplemente '% f'? –

+2

Mejora adicional: macro que reacciona al signo de la parte imaginaria: '#define printfc (c) printf ("% f% c% fi ", creal (c), (cimag (c)> = 0.0f)? '+ ':' \ 0 ', cimag (c)) ' –

-1

Debido a que el número complejo se almacena como dos números reales espalda con espalda en la memoria, haciendo

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

funcionará tan bien, pero genera advertencias del compilador con gcc debido a que el tipo y número de parámetros doesn' t coincide con el formato. Hago esto en una pizca cuando estoy depurando pero no lo hago en el código de producción.

+1

Argumentaría que confiar en un comportamiento indefinido cuando la depuración es una mala idea. El comportamiento indefinido a menudo puede causar otros errores sutiles, lo que agrava el problema. Además, es muy común que el código de depuración desechable termine en producción. –

+2

Esto solo funcionará si las convenciones de llamadas de la plataforma especifican que los números complejos se pasan de la misma manera que dos números reales, lo que de ninguna manera está garantizado. –

+2

Es, sin embargo, solo para la depuración, bastante bueno. Gracias por la idea. –

3

Vamos %+f elegir el signo correcto para usted de parte imaginaria:

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

Salida:

0.000000+1.000000i 

Tenga en cuenta que es i al final.