specifiers long c gcc printf long-double

specifiers - long double c++



printf y doble largo (8)

Además del modificador incorrecto, ¿qué puerto de gcc para Windows? mingw usa la biblioteca de Microsoft C y parece recordar que esta biblioteca no tiene soporte para 80bits de longitud doble (el compilador de microsoft C usa 64 bits de longitud doble por varias razones).

Estoy usando el último gcc con Netbeans en Windows. ¿Por qué no hace long double funciona? ¿El especificador de printf %lf mal?

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 ...


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

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

$ 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` $


Desde la página de manual de printf:

l (ell) Una conversión entera siguiente corresponde a un argumento long int o unsigned long int, o una siguiente n conversión corresponde a un puntero a un argumento int largo, o una siguiente conversión c corresponde a un argumento wint_t, o una conversión siguiente corresponde a un puntero al argumento wchar_t.

y

LA después de una conversión A, e, E, f, F, g o G corresponde a un doble argumento largo. (C99 permite% LF, pero SUSv2 no.)

Entonces, quieres %Le , no %le

Editar: Algunas investigaciones posteriores parecen indicar que Mingw usa el tiempo de ejecución MSVC / win32 (para cosas como printf), que se correlaciona de doble a doble. Así que mezclar un compilador (como gcc) que proporciona un doble largo nativo con un tiempo de ejecución que no parece ... ser un desastre.


En C99, el modificador de longitud para el long double parece ser L y no l . man fprintf (o equivalente para Windows) debería indicarle su plataforma particular.


Estaba teniendo este problema probando dobles largos, y ¡ay !, ¡me encontré con una solución! Tienes que compilar tu 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; }


Sí, durante el long double , debe usar %Lf (es decir, ''L'' en mayúscula).


Si está utilizando MinGW, el problema es que, de manera predeterminada, MinGW usa la I / O resp. funciones de formato del tiempo de ejecución de Microsoft C, que no admite números de punto flotante de 80 bits ( long double == double en Microsoft land).

Sin embargo, MinGW también viene con un conjunto de implementaciones alternativas que soportan correctamente dobles largos. Para usarlos, prefija los nombres de las funciones con __mingw_ (por ejemplo, __mingw_printf ). Dependiendo de la naturaleza de su proyecto, es posible que también desee #define printf __mingw_printf globalmente o use -D__USE_MINGW_ANSI_STDIO (que habilite las versiones MinGW de todas las funciones de la familia printf ).


Corregir la conversación Printf en Java : -

double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06"