2010-11-03 35 views
40

Estoy utilizando el último gcc con Netbeans en Windows. ¿Por qué no funciona long double? ¿Es incorrecto el especificador printf%lf?printf y double double

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

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3-a – gameboy

+0

obviamente hay un problema con MinGW y doble largo – gameboy

+0

posible duplicado de [no se puede imprimir correctamente un doble largo en C] (http://stackoverflow.com/questions/26296058/cant-print-correctly-a-long-double-in-c) –

Respuesta

9

Además del modificador mal, qué puerto de gcc a 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).

+0

sí, tiene razón – gameboy

+0

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3- un – gameboy

4

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

+1

Lástima que sea en Windows, y probablemente no tenga una página de manual. De todos modos, google para "man printf" o "printf manual page" o algo así. –

30

Sí - para long double, necesita usar %Lf (es decir, mayúscula 'L').

36

Desde la página de manual printf:

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

e

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

lo tanto, desea %Le, no %le

Editar: Un poco de investigación adicional parece indicar que Mingw utiliza el/tiempo de ejecución Win32 MSVC (para la materia como printf) - que mapea 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.

+0

Encontré http://linux.die.net/man/3/printf, pero% Lf o% Le tampoco funciona – gameboy

+0

¿Qué compilador usa con Netbeans en Windows? – nos

+0

última gcc y MinGW – gameboy

2

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

Es posible que desee activar la alerta formato mediante el uso de -Wformat (o -Wall, que incluye -Wformat) en la invocación 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` 
$ 
20

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

Sin embargo, MinGW también viene con un conjunto de implementaciones alternativas que do admiten correctamente dobles largos. Para usarlos, prefija los nombres de las funciones con __mingw_ (por ejemplo, __mingw_printf). Dependiendo de la naturaleza de su proyecto, también puede querer globalmente #define printf __mingw_printf o usar -D__USE_MINGW_ANSI_STDIO (que habilita las versiones MinGW de todas las printf -funciones familiares).

6

Estaba teniendo este problema probando dobles largos, y ¡ay !, 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 $ main.c gcc

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 Huntle y @ centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 42,000000

Código:

Jason [email protected]nturian /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; 
} 
-1

conversación Printf correcta 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"