Pregunta

Estoy utilizando la última gcc con Netbeans en Windows. ¿Por qué no long double trabajo? Es el mal printf especificador %lf?

Código:

#include <stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 5.32e-5;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%lf can be written %le\n", dip, dip);

    return 0;
}

Salida:

32000.000000 can be written 3.200000e+004
0.000053 can be written 5.320000e-005
-1950228512509697500000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000.000000
can be written 2.725000e+002
Press [Enter] to close the terminal ...
¿Fue útil?

Solución

Además del modificador mal, qué puerto de gcc a Windows? MinGW utiliza la biblioteca Microsoft C y creo recordar que que esta biblioteca no tiene soporte para 80bits doble largo (Microsoft C compilador de uso de 64 bits de longitud doble, por diversas razones).

Otros consejos

Desde la página de manual printf:

  

l (ELL) A siguiente número entero   corresponde la conversión a un long int   con o sin signo argumento long int, o una   siguiente corresponde conversión n a   un puntero a un argumento long int, o una   c siguiente                 corresponde la conversión a un argumento wint_t, o una siguientes s   corresponde la conversión a un puntero a   argumento wchar_t.

y

  

L A siguiente a, A, E, E, F, F,   G, o G corresponde conversión a una   argumento doble de largo. (C99 permite   LF%, pero SUSv2 no lo hace.)

Por lo tanto, desea %Le, no %le

Edit: Algunas investigaciones complementarias parece indicar que Mingw utiliza el tiempo de ejecución MSVC / Win32 (para cosas como printf) - que hace corresponder a largo doble a doble. Por lo tanto la mezcla de un compilador (como gcc) que proporciona un nativo de largo doble con un tiempo de ejecución que no parece ser un desastre ...

Sí - para long double, es necesario utilizar %Lf (es decir, en mayúsculas 'L')

.

Si está utilizando MinGW, el problema es que, por defecto, MinGW utiliza el resp E / S. funciones de formato desde el tiempo de ejecución de Microsoft C, que no soporta números de punto flotante 80 bits (long double == double en Microsoft tierra).

Sin embargo, MinGW también viene con un conjunto de implementaciones alternativas que DO apoyar adecuadamente dobles largos. Para utilizarlos, prefijar los nombres de función con __mingw_ (por ejemplo __mingw_printf). Dependiendo de la naturaleza de su proyecto, también puede que quiera globalmente #define printf __mingw_printf o uso -D__USE_MINGW_ANSI_STDIO (que permite a las versiones MinGW de todas las funciones printf-familiares).

estaba teniendo este problema prueba de dobles largos, y por desgracia, me encontré con una solución! Usted tiene que compilar el proyecto con -D__USE_MINGW_ANSI_STDIO:

  

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ Gcc main.c

     

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ A.exe c = 0.000000

     

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ Gcc main.c -D__USE_MINGW_ANSI_STDIO

     

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ A.exe c = 42.000000

Código:

Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>

int main(int argc, char **argv)
{
   long double c=42;

   c/3;

   printf("c=%Lf\n",c);

   return 0;
}

En C99 el modificador de longitud para long double parece ser L y no l. man fprintf (o equivalente para Windows) que debe reportar a su plataforma en particular.

Como se ha dicho en otras respuestas, el especificador de conversión correcta es "%Lf".

Es posible que desee activar la alerta formato mediante el uso de -Wformat (o -Wall, que incluye -Wformat) en el gcc invocación

$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$

printf y scanf función en C / C ++ utiliza la biblioteca Microsoft C y esta biblioteca no tiene soporte para 10 byte de longitud doble. Así que cuando se utiliza la función printf y scanf en su código C / C ++ para imprimir un largo doble como salida y tomar alguna entrada como una larga doble, que siempre le dará un resultado erróneo.

Si desea utilizar doble largo entonces usted tiene que utilizar "__mingw_printf" y la función "__mingw_scanf" en lugar de printf y scanf. Tiene soporte para 10 byte de longitud doble.

o puede definir dos macro como esta: "#define printf __mingw_printf" y "# define scanf __mingw_scanf"

Usar el formato estándar para una larga doble:% Lf

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top