2010-11-03 12 views
40

Sto utilizzando l'ultimo gcc con Netbeans su Windows. Perché lo non funziona? L'identificatore printf è errato? %lf?printf e long double

Codice:

#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; 
} 

uscita:

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

ovviamente c'è un problema con MinGW e lungo doppio – gameboy

+0

possibile duplicato di [non può stampare correttamente un lungo doppio in C] (http://stackoverflow.com/questions/26296058/cant-print-correctly-a-long-double-in-c) –

risposta

9

Oltre al modificatore di sbagliato, che porto di gcc a Windows? mingw usa la libreria Microsoft C e mi sembra di ricordare che questa libreria non ha supporto per 80bit double double (il compilatore C microsoft usa 64 bit long double per vari motivi).

+0

sì, hai ragione – gameboy

+0

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

4

Nel C99 il modificatore di lunghezza per long double sembra essere L e non l. man fprintf (o equivalente per Windows) dovrebbe dirti per la tua piattaforma particolare.

+1

Peccato che sia su Windows e probabilmente non ha una pagina di manuale. Ad ogni modo, google per "man printf" o "printf manual page" o qualcosa del genere. –

30

Sì - per long double, è necessario utilizzare %Lf (vale a dire, maiuscolo 'L').

36

Dalla manpage printf:

l (elle) A seguito intero conversione corrisponde ad una lunga int o unsigned long int argomento, o un seguente conversione n corrisponde al un puntatore a una lunga argomento int, o un seguente c conversione corrisponde a un argomento wint_t, o una successiva s conversione corrisponde a un puntatore a argomento wchar_t .

e

L A seguito di una, A, e, E, F, F, g, o conversione G corrisponde a una lunga discussione doppia . (. C99 consente % LF, ma SUSv2 non lo fa)

Quindi, si vuole %Le, non %le

Edit: Alcuni ulteriori indagini sembra indicare che Mingw utilizza il/runtime win32 MSVC (per le cose come printf) - che mappa lungo da doppio a doppio. Quindi mescolando un compilatore (come gcc) che fornisce un doppio lungo nativo con un runtime che non sembra .. essere un disastro.

+0

Ho trovato http://linux.die.net/man/3/printf, ma% Lf o% Le anche non funzionante – gameboy

+0

Quale compilatore stai usando con Netbeans su Windows? – nos

+0

ultimo gcc e MinGW – gameboy

2

Come è stato detto in altre risposte, lo specifico di conversione corretto è "%Lf".

Si potrebbe desiderare di attivare l'avviso formato utilizzando -Wformat (o -Wall, che comprende -Wformat) nell'invocazione 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

Se si utilizza MinGW, il problema è che, per impostazione predefinita, MinGW utilizza l'I/O risp. funzioni di formattazione dal runtime Microsoft C, che non supporta i numeri in virgola mobile a 80 bit (== double in Microsoft land).

Tuttavia, MinGW viene fornito con una serie di implementazioni alternative che do supportano correttamente i doppi lunghi. Per utilizzarli, anteporre i nomi delle funzioni con __mingw_ (ad esempio __mingw_printf). A seconda della natura del tuo progetto, potresti anche voler globalmente #define printf __mingw_printf o utilizzare -D__USE_MINGW_ANSI_STDIO (che abilita le versioni MinGW di tutte le funzioni printf -family).

6

Stavo testando questo problema a lungo raddoppiato, e purtroppo ho trovato una soluzione! È necessario compilare il progetto 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 Huntle y @ Centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 42,000000

Codice:

Jason [email protected] /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

corretta conversazione Printf in 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"