Domanda

Sto usando l'ultima gcc con Netbeans su Windows. Perché non long double lavoro? È dalla parte del torto printf specificatore %lf?

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

Output:

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 ...
È stato utile?

Soluzione

In aggiunta al modificatore di sbagliato, che porto di gcc a Windows? MinGW utilizza la libreria Microsoft C e mi sembra di ricordare che che questa libreria non ha il supporto per 80bits lungo doppio (C uso compilatore Microsoft a 64 bit di lunghezza doppia per vari motivi).

Altri suggerimenti

Dalla pagina di manuale printf:

  

l (elle) A seguito intero   corrisponde conversione verso un long int   o unsigned long int argomento, o un   seguente corrisponde n conversione verso   un puntatore ad un argomento long int, o un   dopo c                 corrisponde conversione verso un argomento wint_t, o un seguenti s   corrisponde conversione verso un puntatore   argomento wchar_t.

e

  

L A seguito di una, A, e, E, F, F,   g, o G corrisponde ad un conversione   long double argomento. (C99 permette   % LF, ma SUSv2 non lo fa.)

Quindi, si vuole %Le, non %le

Edit: Alcuni ulteriori indagini sembra indicare che Mingw utilizza il runtime MSVC / win32 (per cose come printf) - che mappa long double di raddoppiare. Quindi, mescolando un compilatore (come gcc), che fornisce un nativo lunga doppia con un tempo di esecuzione che non sembra .. essere un pasticcio.

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

.

Se si sta usando MinGW, il problema è che per impostazione predefinita, MinGW utilizza il resp I / O. formattazione funzioni dal runtime Microsoft C, che non supporta i numeri in virgola mobile 80 bit (long double == double nella terra di Microsoft).

Tuttavia, MinGW viene inoltre fornito con una serie di implementazioni alternative che fanno sostenere adeguatamente lunghe doppie. Per utilizzarli, precedere i nomi delle funzioni con __mingw_ (ad esempio __mingw_printf). A seconda della natura del progetto, si potrebbe anche voler globalmente #define printf __mingw_printf o l'uso -D__USE_MINGW_ANSI_STDIO (che permette le versioni MinGW di tutte le funzioni printf-famiglia).

stava avendo questo problema testando doppie lunghe, e ahimè, mi sono imbattuto in una correzione! È 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 Huntley @ Centurian /home/developer/dependencies/Python-2.7.3/test   $ C = a.exe 42.000000

Codice:

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

Nel C99 il modificatore di lunghezza per long double sembra essere L e non l. man fprintf (o equivalente per Windows) dovrebbero dire per la relativa piattaforma.

Come è stato detto in altre risposte, il corretto indicatore di conversione è "%Lf".

Si potrebbe desiderare di attivare l'avviso formato utilizzando -Wformat (o -Wall, che comprende -Wformat) nella gcc invocazione

$ 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 e della funzione scanf in C / C ++ utilizza la libreria Microsoft C e questa biblioteca non ha il supporto per 10 byte long double. Così, quando si utilizza printf e la funzione scanf nel codice C / C ++ per stampare un lungo doppio come uscita e di prendere qualche input come un lungo doppio, che vi darà sempre risultato sbagliato.

Se si desidera utilizzare lungo doppio allora bisogna usare "__mingw_printf" e la funzione "__mingw_scanf" invece di printf e scanf. Ha il supporto per 10 byte di lunghezza doppia.

In alternativa, è possibile definire due macro in questo modo: "#define printf __mingw_printf" e "# define scanf __mingw_scanf"

Usa formato standard per i long double:% Lf

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top