Programmation C : correction des boucles et précision de la virgule flottante dans les tables de conversion

8

Écrire un simple convertisseur de température semble trivial jusqu’à ce que vous réalisiez avec quelle facilité la logique de base se brise. Vous commencez avec une boucle « while », vous lancez une table Fahrenheit-Celsius, et tout semble bien. Mais vous avez alors besoin d’un point de données spécifique, comme la température du corps humain, et tout à coup, votre code propre se transforme en un cauchemar de débogage.

Voici un aperçu concret du fonctionnement du bouclage en C, de l’importance de la précision et de la façon d’empêcher vos programmes de se bloquer pour toujours.

Les bases : boucles entières

Regardons la version la plus simple possible. Vous souhaitez imprimer un tableau de 0 à 100 degrés Fahrenheit, en sautant de 10 secondes. Vous utilisez un entier int pour le compteur a.

Exécutez ceci et vous obtenez une grille propre :

C’est fonctionnel. C’est rapide. Mais c’est moche. Pourquoi? Parce que la division entière tronque les décimales. (a - 32) * 5 / 9 supprime la partie fractionnaire avant l’impression. Si vous avez besoin de précision, vous avez besoin de nombres à virgule flottante.

Précision en virgule flottante

Passer à « float » change les calculs. Vous devez également remplacer le spécificateur de format de %d par %f. Le code ci-dessous utilise %6.2f, qui indique à l’imprimante de réserver six espaces, en gardant deux chiffres après la virgule.

La sortie comporte désormais de véritables décimales. Cela a l’air professionnel. Mais que se passe-t-il si vous avez besoin d’une valeur spécifique qui ne correspond pas au modèle ?

Le bug de la température corporelle

Imaginez que vous souhaitiez insérer 98,6°F (température normale du corps humain) dans ce tableau. Il n’atteint pas un multiple de 10. Vous ajoutez donc une instruction « if ».

Cela fonctionne pour 100. Mais changez la limite de boucle à 200 et la logique s’effondre. La condition « si (a > 98,6) » reste vraie pour chaque itération suivante. Vous imprimerez 98,6°F encore et encore.

Pourquoi cela arrive-t-il ? Parce que la condition vérifie si le nombre actuel est supérieur à 98,6. Une fois que « a » atteint 100, il sera toujours supérieur à 98,6. Vous ne vérifiez pas si vous venez de le réussir. Vous vérifiez si vous êtes au-delà de cela.

Le correctif : état de suivi

Pour résoudre ce problème, vous devez vous souvenir de la valeur précédente. Vous introduisez une deuxième variable, b, initialisée à -1.

Maintenant, la logique est solide. Il n’imprime la ligne supplémentaire que si « a » est actuellement supérieur à 98,6 ET « b » était auparavant inférieur à 98.

Article précédentPourquoi la singularité technologique pourrait réellement se produire d’ici 2030
Article suivantComment choisir le téléphone le plus sécurisé : équilibrer le matériel, les logiciels et le support