Ci dessous une routine pour convertir un nombre en virgule flottante en chaîne de caractères. Plutôt que d'utiliser des fonctions toutes faites de la bibliothèque de MikroC, j'aimerais utiliser cette routine en opensource. Un peu familier du C et de MikroC, néanmoins je ne comprends pas bien l'organisation de cette routine, le principe de conversion utilisé, la succession des différentes boucles for, while, leurs conditions logiques utilisées pour y entrer, l'initialisation des différentes variables. Elle fonctionne car je l'ai utilisé dans un programme pour réaliser un thermomètre numérique avec le capteur LM35.
Pourriez vous m'éclairer ? Un algorithme simple m'aiderait à comprendre.
Code:void float2aascii (float x, unsigned char *str, char precision) { // Converts a floating point number to an ASCII string. // Version limited at 5 decimals maximum. // x is stored into str, which should be at least 30 chars long. int ie, i, k, ndig; double y; if (precision >= 5) { precision = 5; } else { precision++; } ndig = precision; ie = 0; // If x is negative, write minus and reverse. if (x < 0.00000) { *str++ = '-'; x = -x; } // Put x in range 1 <= x < 10. if (x > 0.000000) { while (x < 1.000000) { x *= 10.000; ie--; } } while (x >= 10.0000) { x = x / 10.0000; ie++; } // In f format, number of digits is related to size. ndig += ie; // round x is between 1 and 10 and ndig will be printed to right of decimal point … for (y = i = 1; i < ndig; i ++) { y = y / 10.0000; } x += y / 2.0000; if (x >= 10.0000) { x = 1.0000; ie++; } if (ie < 0) { *str++ = '0'; *str++ = '.'; if (ndig < 0) { ie = ie - ndig; } for (i = -1; i > ie; i --) { *str++ = '0'; } } for (i = 0; i < ndig; i ++) { k = x; *str++ = k + '0'; if (i == ie) { *str++ = '.'; } x -= (y = k); x *= 10.0000; } *str = '\0'; }
-----