Especificador de conversión de doble largo en C

El tipo de datos doble largo puede tener estos especificadores de conversión en C:% Le,% LE,% Lf,% Lg,% LG ( referencia ).

Escribí un pequeño progtwig para probar:

#include  int main(void) { long double d = 656546.67894L; printf("%.0Le\n",d); printf("%.0LE\n",d); printf("%.0Lf\n",d); printf("%.0Lg\n",d); printf("%.0LG\n",d); return 0; } 

Salida:

-0

-4E-153

-0

-4e-153

-4E-153

Pero ninguno está dando el resultado deseado, que es 656547 (como usted puede entender fácilmente). ¿Cual es la razon?

El comstackdor utilizado es gcc versión 3.4.2 (mingw-special).

De una vieja wiki de mingw :

mingw usa las bibliotecas de tiempo de ejecución de Microsoft C y su implementación de printf no es compatible con el tipo “doble largo”. Como solución alternativa, puede convertir a ‘doble’ y pasarlo a printf en su lugar. Por ejemplo:

 printf("value = %g\n", (double) my_long_double_value); 

Tenga en cuenta que existe un problema similar para el tipo ‘long long’. Use el modificador de longitud ‘I64’ (ojo sesenta y cuatro) en lugar de gcc’s ‘ll’ (ell ell). Por ejemplo:

 printf("value = %I64d\n", my_long_long_value); 

Editar (6 años después): vea también el comentario de Keith Thompson a continuación para una solución alternativa:

#define __USE_MINGW_ANSI_STDIO 1 en el archivo de origen o cambie la línea de comando a gcc -D__USE_MINGW_ANSI_STDIO=1

La biblioteca MinGW C es proporcionada por MSVCRT.DLL, que se envía con Windows y es, de hecho, la antigua biblioteca VC ++ 6.0.

Sin embargo, MinGW utiliza la biblioteca GNU C ++, y aunque eso depende de la biblioteca C subyacente, sí admite el doble largo para la salida usando iostreams. Incluso si no desea utilizar C ++ en general, puede valer la pena usar lo suficiente para admitir esta capacidad.