printf et long double

J’utilise le dernier gcc avec Netbeans sous Windows. Pourquoi ne long double pas long double travail? Le spécificateur printf est-il faux?

Code:

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

Sortie:

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

En plus du mauvais modificateur, quel port de gcc vers Windows? mingw utilise la bibliothèque Microsoft C et je semble me souvenir que cette bibliothèque ne prend pas en charge les doubles de 80 bits (le compilateur Microsoft C utilise 64 bits de long double pour diverses raisons).

De la page de manuel printf:

l (ell) Une conversion entière suivante correspond à un argument long int ou unsigned long int, ou une conversion n suivante correspond à un pointeur sur un argument long int, ou une conversion c suivante correspond à un argument wint_t, ou à une conversion s suivante correspond à un pointeur sur l’argument wchar_t.

et

LA suivant les conversions a, A, e, E, f, F, g ou G correspond à un argument long double. (C99 autorise% LF, mais pas SUSv2.)

Donc, vous voulez %Le , pas %le

Edit: Des recherches plus approfondies semblent indiquer que Mingw utilise le runtime MSVC / win32 (pour des choses comme printf) – qui correspond au double long du double. Donc, mixer un compilateur (comme gcc) qui fournit un long double natif avec un runtime qui ne semble pas être un gâchis.

Oui – pour le long double , vous devez utiliser %Lf (c.-à-d. Majuscule ‘L’).

Si vous utilisez MinGW, le problème est que, par défaut, MinGW utilise les E / S resp. fonctions de formatage à partir du runtime Microsoft C, qui ne prend pas en charge les nombres à virgule flottante de 80 bits ( long double == double dans Microsoft Land).

Cependant, MinGW est également livré avec un ensemble d’implémentations alternatives qui supportent correctement les doubles longs. Pour les utiliser, __mingw_ noms de fonctions avec __mingw_ (par exemple, __mingw_printf ). Selon la nature de votre projet, vous pouvez également vouloir globalement #define printf __mingw_printf ou utiliser -D__USE_MINGW_ANSI_STDIO (qui active les versions MinGW de toutes les fonctions de la famille printf ).

Avait ce problème test de longs doubles, et hélas, je suis tombé sur un correctif! Vous devez comstackr votre projet avec -D__USE_MINGW_ANSI_STDIO:

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

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

Jason Huntley @ centurian /home/developer/dependends/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

Code:

 Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test $ cat main.c #include  int main(int argc, char **argv) { long double c=42; c/3; printf("c=%Lf\n",c); return 0; } 

En C99, le modificateur de longueur du long double semble être L et non l . man fprintf (ou équivalent pour Windows) devrait vous indiquer votre plateforme particulière.

Comme cela a été dit dans d’autres réponses, le spécificateur de conversion correct est "%Lf" .

Vous pouvez activer l’avertissement de format en utilisant -Wformat (ou -Wall , qui inclut -Wformat ) dans l’invocation gcc

 $ gcc source.c
 $ gcc -Wall source.c
 source.c: Dans la fonction `main`:
 source.c: 5: avertissement: le format "% lf" attend le type `double`, mais l'argument 2 a le type` long double`
 source.c: 5: avertissement: le format "% le" attend le type `double`, mais l'argument 3 a le type` long double`
 $

Conversation correcte de 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"