printf, double et .0

Le
Thierry B.
Bonjour à tous.

Je suis en train de me prendre la tête sur un problème cosmétique
avec les flottants, et leur affichage, et la manpage printf(3)

Hop, un bout de code:

#v+
double foo;
foo = (double)1.0;
printf("f %f", foo);
printf("F %F", foo);
printf("g %g", foo);
printf("G %G", foo);
printf("#f %#f", foo);
printf("#F %#F", foo);
printf("#g %#g", foo);
printf("#G %#G", foo);
printf(".f %.f", foo);
printf(".g %.g", foo);
#v-

Et hop, le résultat:

#v+
f 1.000000
F 1.000000
g 1
G 1
#f 1.000000
#F 1.000000
#g 1.00000
#G 1.00000
.f 1
.g 1
#v-

Maintenant, la grande question existentialiste, comment avoir
l'affichage de cette variable sour la forme "1.0" ? Bien entendu
sans perdre les digits si la valeur n'est pas entière ?

tTh.


--
"Un nouveau corps céleste inconnu est entré dans le système solaire, voulez
vous que Windows® télécharge et installe le pilote nécessaire pour 'Halley
comet' ? Un redémarrage du système solaire sera nécessaire pour prendre en
compte les nouvelles fonctionalités." -{ Doug, in fcol.debats }--
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Vincent Lefevre
Le #1228663
Dans l'article Thierry B.
Maintenant, la grande question existentialiste, comment avoir
l'affichage de cette variable sour la forme "1.0" ? Bien entendu
sans perdre les digits si la valeur n'est pas entière ?


Si tu ne veux pas perdre de chiffre, il te faut afficher la valeur
avec 17 chiffres de précision. Mais ni la forme "normale", ni la
forme "alternative" (qui conserve tous les 0) ne te convient. Je
ne vois pas d'autre solution que de faire du post-processing de la
chaîne, en partant d'une de ces deux formes obtenue avec sprintf.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Thierry B.
Le #1233945
--{ Vincent Lefevre a plopé ceci: }--

Maintenant, la grande question existentialiste, comment avoir
l'affichage de cette variable sour la forme "1.0" ? Bien entendu
sans perdre les digits si la valeur n'est pas entière ?


Si tu ne veux pas perdre de chiffre, il te faut afficher la valeur
avec 17 chiffres de précision. Mais ni la forme "normale", ni la
forme "alternative" (qui conserve tous les 0) ne te convient. Je
ne vois pas d'autre solution que de faire du post-processing de la
chaîne, en partant d'une de ces deux formes obtenue avec sprintf.

C'est la conclusion à laquelle je suis arrivé, après moultes

lectures. Je vais essayer de trouver comment faire, et je
reviendrais dès que j'ai trouvé...


--
{ SIGAREDECUBA, "HAVANE" },
/* Instructs the process to share resources and to hate USA. Kill
* remains the dictator, though */
--{ f.m.b.l revisite la command kill }--


Vincent Lefevre
Le #1234901
Dans l'article Thierry B.
--{ Vincent Lefevre a plopé ceci: }--

Si tu ne veux pas perdre de chiffre, il te faut afficher la valeur
avec 17 chiffres de précision. Mais ni la forme "normale", ni la
forme "alternative" (qui conserve tous les 0) ne te convient. Je
ne vois pas d'autre solution que de faire du post-processing de la
chaîne, en partant d'une de ces deux formes obtenue avec sprintf.

C'est la conclusion à laquelle je suis arrivé, après moultes

lectures. Je vais essayer de trouver comment faire, et je
reviendrais dès que j'ai trouvé...


Ceci dit, ce post-processing est relativement facile:

1. Avec la forme normale, tu détectes lorsqu'il n'y a pas de point,
et tu ajoutes ".0" dans ce cas.

2. Avec la forme alternative, tu enlèves les 0 finaux, mais en
laissant toujours au moins un chiffre après le point.

Concernant le point, il faut faire attention si tu n'es pas en locale C
car cela peut être un autre caractère (decimal_point). Et il faut
décaler la partie exposant s'il y en a une.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Publicité
Poster une réponse
Anonyme