Question

J'utilise la dernière gcc avec Netbeans sous Windows. Pourquoi ne long double pas de travail? Le mauvais spécificateur printf de %lf?

Code:

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

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 ...
Était-ce utile?

La solution

En plus du mauvais modificateur, le port de gcc à Windows? MinGW utilise la bibliothèque Microsoft C et je crois me souvenir que cette bibliothèque n'a pas de support pour 80bits long double (compilateur Microsoft C utiliser 64 bits long double pour diverses raisons).

Autres conseils

De la page de manuel printf:

  

l (ell) Un nombre entier suivant   correspond à la conversion en un long int   ou un argument long unsigned int, ou   suivant correspond de conversion de n à   un pointeur sur un long argument int, ou   suivant c                 correspond de conversion à un argument de wint_t, ou une s suivantes   correspond de conversion à un pointeur vers   wchar_t.

et

  

L A la suite d'une, A, E, E, F, F,   g, ou de conversion correspond à un G   long double argument. (C99 permet   % LF, mais SUSv2 ne fonctionne pas.)

Alors, vous voulez %Le, pas %le

Edit: une enquête plus poussée semble indiquer que Mingw utilise le moteur d'exécution MSVC / win32 (pour des trucs comme printf) - qui associe long double à double. Donc le mélange d'un compilateur (comme gcc) qui fournit un natif long double avec un moteur d'exécution qui ne semble pas être un gâchis ...

Oui - pour long double, vous devez utiliser %Lf (à savoir, majuscules 'L')

.

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

Cependant, MinGW est également livré avec un ensemble d'implémentations alternatives que Bougez supportent correctement les doubles longues. Pour les utiliser, préfixe les noms de fonction avec __mingw_ (par exemple __mingw_printf). En fonction de la nature de votre projet, vous pouvez également globalement #define printf __mingw_printf de -D__USE_MINGW_ANSI_STDIO ou de l'utilisation (qui permet aux versions MinGW de toutes les fonctions printf-famille).

était d'avoir ce problème test long double, et hélas, je suis tombé sur une solution! Vous devez compiler votre projet avec -D__USE_MINGW_ANSI_STDIO:

  

Jason Huntley @ centurion /home/developer/dependencies/Python-2.7.3/test   $ Gcc main.c

     

Jason Huntley @ centurion /home/developer/dependencies/Python-2.7.3/test   $ A.exe c = 0.000000

     

Jason Huntley @ centurion /home/developer/dependencies/Python-2.7.3/test   $ Gcc main.c -D__USE_MINGW_ANSI_STDIO

     

Jason Huntley @ centurion /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 <stdio.h>

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 pour long double semble être L et non l. man fprintf (ou équivalent pour les fenêtres) devraient vous dire pour votre plate-forme particulière.

Comme il a été dit dans d'autres réponses, les indicateurs de conversion correcte est "%Lf".

Vous pouvez activer l'avertissement de format en utilisant -Wformat (ou -Wall, qui comprend -Wformat) dans l'invocation 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`
$

printf et la fonction scanf en C / C ++ utilise la bibliothèque Microsoft C et cette bibliothèque n'a pas de support pour 10 octets long double. Ainsi, lorsque vous utilisez la fonction printf et scanf dans votre code C / C ++ pour imprimer un long double en sortie et de prendre une entrée comme un long double, il vous donnera toujours un résultat erroné.

Si vous souhaitez utiliser un long double, vous devez utiliser « __mingw_printf » et la fonction « __mingw_scanf » au lieu de printf et scanf. Il a un support pour 10 octets long double.

Ou vous pouvez définir deux macro comme ceci: "#define printf __mingw_printf" et "#define scanf __mingw_scanf"

Utiliser le format standard pour long double:% Lf

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top