Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

printf, double et .0

3 réponses
Avatar
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\n", foo);
printf("F %F\n", foo);
printf("g %g\n", foo);
printf("G %G\n", foo);
printf("#f %#f\n", foo);
printf("#F %#F\n", foo);
printf("#g %#g\n", foo);
printf("#G %#G\n", foo);
printf(".f %.f\n", foo);
printf(".g %.g\n", 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 }--

3 réponses

Avatar
Vincent Lefevre
Dans l'article ,
Thierry B. écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Thierry B.
--{ 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 }--


Avatar
Vincent Lefevre
Dans l'article ,
Thierry B. écrit:

--{ 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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)