Variable de type long double

Problème d'impression sous Windows Vista

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Sur ma machine j'ai en double boot Vista et Linux. Sous Windows Vista j'utilise CodeBlocks (déjà là) et je n'ai pas suivi votre introduction par flemme ;) Par contre sous Linux j'ai suivi vos indications.

Au chapitre 'Manipulations basiques des e/s', dans la partie 'Les Formats', nous avons (en raccourci) le code suivant :

1
2
3
4
5
6
7
#include <stdio.h>
int main(void)
{
    long double g = 70.0;
    printf("%Lg\n", g);
    return 0;
}

Sous Linux la sortie est celle attendue, mais sous Vista elle n'est pas bonne du tout.

Est-ce le fait de travailler sous CodeBlock ou plus généralement sous Windows qui explique cela ? En faisant des recherches j'ai trouvé comme explication (un peu brève) que MinGW, par défaut, utilise les fonctions e/s de l'environnement Microsoft C, qui ne supporte pas les nombres flottants de 80bit (long double == double chez Microsoft).

Cordialement

Effectivement, cela semble être dû à l'utilisation du compilateur MinGW, qui fait que la fonction printf réinterprète un long double comme un simple double. À priori, aucun rapport direct avec Code::Blocks.

D'après ce que j'ai lu, une solution serait d'ajouter l'option de compilation -D__USE_MINGW_ANSI_STDIO. Sinon , tu pourrais également compiler avec MSVC, sous Visual Studio qui est franchement mieux que Code::Blocks.

Il serait également intéressant de tester ce code avec Clang sous Windows.

Salut,

Effectivement, il y a soucis sous Windows avec l'affichage des long double. Visiblement, cela peut être régler à l'aide d'une définition de macroconstante. Est-ce que l'ajout de la ligne suivante au début de ton fichier corrige le problème ?

1
#define __USE_MINGW_ANSI_STDIO 1

Édit : grillé.

+0 -0

@ Olybri

Bonjour et merci de ta réponse ; en fait j'ai répondu à l'arrache, pressé par un rdv (ça se voit à l'écran), au conseil de Taurre.

Je vois que vos réponses sont proches, mais comme je commence je ne saurais même pas où mettre l'option de compilation que tu indiques.

Cordialement

un peu d'explication de la part des spécialistes ?

adlerfil

Je suis pas spécialiste, mais je crois que tu as déjà plus ou moins répondu à ta question. Il semblerait effectivement que MinGW choisisse par défaut de faire en sorte que prtinf se base sur le style d'affichage des systèmes Windows. En définissant la macro __USE_MINGW_ANSI_STDIO, tu « forces » la fonction printf à conserver le style GNU.

Pour définir une macro, soit tu mets un #define en début de fichier, soit tu compile avec l'option -Dnom_de_la_macro. Il suffit d'ajouter cette option dans la ligne de commande :

1
$ gcc -D__USE_MINGW_ANSI_STDIO main.cpp

Avec Code::Blocks, tu vas dans Project > Build options > Other compiler options et tu ajoutes l'option.

Oui ; en fait je suis retourné dans les Build options et l'option que j'avais mise dans Other compiler options se trouve maintenant inscrite sous l'onglet #defines.

Bon, c'est hors sujet (mais le dire et où ?) je vois que je n'arrive pas à formater le texte pour laisser un espace après le texte en italique ; mais je vois que ton texte fait la même chose ;)

Si, il y a bel et bien un espace (on peut le voir en sélectionnant le texte). Je pense que cette impression est due au fait que les caractères sont penchés vers la droite. (Après, ça peut aussi varier légèrement d'un navigateur à l'autre.)

(Après, ça peut aussi varier légèrement d'un navigateur à l'autre.)

Olybri

Oui, merci de m'avoir mis sur la piste. En fait, chez moi, c'est selon le système d'exploitation : le comportement du même navigateur (Firefox) est différent sous Vista et sous Linux.

Sous Linux : impeccable on voit bien les espaces entre les mots ; sous Vista les lettres sont collées.

Cordialement

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte