C número complejo y printf

2 minutos de lectura

avatar de usuario
game boy

¿Cómo imprimir (con printf) un número complejo? Por ejemplo, si tengo este código:

#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é especificadores de conversión (o algo más) debo usar en lugar de “???”

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

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

  • Podría estar equivocado aquí, pero como tanto crel() como cimag() devuelven dobles, ¿no debería ser el especificador de formato ‘%lf’ en lugar de simplemente ‘%f’?

    – Jon Doe

    30 de junio de 2015 a las 17:06


  • 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))

    – Agnius Vasiliauskas

    21/09/2015 a las 19:02

  • @JonDoe No importa. printf no es scanf, f y lf están bien para doble. Ver stackoverflow.com/questions/210590/…

    – ntysdd

    9 de mayo de 2017 a las 2:16

  • @AgniusVasiliauskas ¿Sabes que %c también saldrá \0? mejor uso %s con ? "+" : ""

    – 12431234123412341234123

    1 de julio de 2021 a las 18:39


Dejar %+f elige el signo correcto para ti para la parte imaginaria:

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

Producción:

0.000000+1.000000i

Tenga en cuenta que i está al final.

Debido a que el número complejo se almacena como dos números reales uno al lado del otro en la memoria, haciendo

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

funcionará también, pero genera advertencias del compilador con gcc porque el tipo y la cantidad de parámetros no coinciden con el formato. Hago esto en caso de apuro cuando depuro, pero no lo hago en el código de producción.

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

    –David Marrón

    22 de noviembre de 2012 a las 20:25

  • 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 cual no está garantizado de ninguna manera.

    – Esteban Canon

    23 de noviembre de 2012 a las 1:57

  • Sin embargo, es solo para depuración, un buen truco. Gracias por la idea.

    –Rhys Ulerich

    13 de febrero de 2014 a las 17:23

  • Actualmente usando un compilador con _Complex pero nada más. Usando back-to-back en mem de una manera más segura como tal: printf("%f%+fi\n", (double)D, *((double*)&D+1));

    – dargaud

    21 de enero de 2020 a las 15:23

Usando GNU C, esto funciona:

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

O, si desea que se imprima un sufijo de “i” después de la parte imaginaria:

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad