no se puede imprimir correctamente un doble largo en C

Estoy tratando de imprimir un doble largo simple, pero no funciona

Lo que intenté:

long double ld=5.32; printf("ld with le = %Le \n",ld); printf("ld with lf = %Lf \n",ld); printf("ld with lg = %Lg \n",ld); 

Salida:

 ld with le = -3.209071e-105 ld with lf = -0.000000 ld with lg = -3.20907e-105 

Con un nuevo valor:

 ld=6.72; 

Salida:

 ld with le = -1.972024e+111 ld with lf = -1972024235903379200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 ld with lg = -1.97202e+111 

Hay un problema similar con MinGW en Windows. Si eso no es lo que estás usando, esta respuesta probablemente no se aplica.

El problema es que el comstackdor (GCC) y la biblioteca de tiempo de ejecución (Microsoft) están implementados por diferentes grupos que tienen diferentes ideas sobre cómo se debe representar el tipo long double . (gcc usa 128 bits para el long double ; Microsoft usa 64 bits, con la misma representación que el double ).

Cualquiera de las dos opciones de representación es perfectamente legítima, pero son incompatibles entre sí. No es un error ni en GCC ni en la biblioteca de Microsoft, sino en la forma en que MinGW los integra.

Sus opciones son usar una implementación que no sea MinGW, escribir o copiar código que maneje correctamente el long double correctamente, o evitar llamar a las funciones de la biblioteca que toman argumentos o devuelven resultados del tipo long double (los cálculos en el long double no deberían ser un problema siempre y cuando no llamen a ninguna función de biblioteca). Por ejemplo, puede convertir a double e imprimir con %g , con cierta pérdida de rango y precisión.

Otra solución (probablemente mejor) es comstackr con -D__USE_MINGW_ANSI_STDIO , lo que hace que MinGW use su propia implementación de printf y amigos en lugar de confiar en la implementación de Microsoft.