11.8.1.1 : Conversion décimal-binaire et binaire-décimal

Tout nombre binaire à virgule peut obtenir une représentation décimale exacte (avec un nombre fini de chiffres). Ce n'est pas le cas en sens inverse, l'exemple archétypique étant $0,2=\frac{1}{5}$ et bien sûr $0,1$ et $0,3$ , d'où la violation flagrante de l'identité $0,1 + 0,2 = 0,3$ noteet ce quelle que soit la précision, mais plus manifeste en simple qui laisse pantelant le néophyte. Ainsi lorsque, fréquemment, il n'y a pas un nombre binaire à $n$ chiffres qui corresponde exactement au nombre décimal saisi, on tronque en cherchant le nombre binaire à $n$ chiffres le plus proche. Et pour tronquer vers une précision donnée, il faut pouvoir procéder aux calculs dans une précision plus élevée. Les auteurs des premières versions de fonctions systèmes de conversion décimal (chaîne) vers binaire atod, atof ou strtod, strtof était plus soucieux de correction au premier ordre et de performance que de ces finasseries toutes byzantines.

D'une manière plus surprenante, alors que tout nombre binaire a l'assurance d'avoir une expression unique et finie en décimal, ce n'est pas cette valeur qui apparaît à l'écran dans un printf. Cette traduction fidèle requerrait plus de chiffres que la précision dans laquelle le nombre flottant est stocké, et donc serait inepte. Aussi cherche-t-on le nombre décimal dont l'expression est la plus courte et qui soit situé à moins d'une demie ulp du nombre binaire. Cette minimisation conduit à de nombreuses comparaisons et à des calculs en précision supérieure à la précision cible de la routine. Là encore, les auteurs originaux ont eu une approche plus pragmatique notevoir https://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/.

Depuis trente ans, on trouve cependant des routines qui procèdent à ces conversions avec un arrondi correct~[221]Correctly Rounded Binary-Decimal and Decimal-Binary Conversions, 1990, Gay, David M. notearticle en ligne https://ampl.com/REFS/rounding.pdf et source disponible sur http://www.netlib.org/fp/. De nouveaux algorithmes plus rapides sont même apparus~[222]Printing Floating-point Numbers Quickly and Accurately with Integers, 2010, Loitsch, Florian. Mais sont-ils disponibles dans nos compilateurs, et nos systèmes~?