Buenas Pino, he vuelto a mirarlo pero no encuentro demasiada inspiración; sigo encontrando el problema de la representación interna del número que usa el computador.
El asunto deriva de la representación binaria de números decimales. Algunos números tienen una representació exacta, pero otros son solo aproximaciones. Si almacenamos por ejemplo 3.44 en un double, el valor real almacenado en el sistema puede ser 3.439999999999999946709294817992486059665679931640625, que tiene 51 posiciones dígitos en su parte decimal (aunque nosotros por pantalla veamos 3.44). Para C 3.44 y 3.439999999999999946709294817992486059665679931640625 vienen siendo el mismo número, de ahí la dificultad de poder decir cuántos decimales tiene. Si el número que internamente guarda el computador es 3.439999999999999946709294817992486059665679931640625 ¿Por qué íbamos a ser capaces de decir que tiene 2 decimales? (Realmente en la representación interna no los tiene).
Podría tratar de detectarse a qué valor está próximo el número, pero eso también es complejo sobre todo porque no estaría claro a qué número se debe aproximar un número con 51 dígitos decimales.
Una aproximación a resolver el problema sería basarse en convertirlo a string, extraer los tokens, hacer el conteo y devolver el número de decimales
#include <stdio.h>
#include <string.h>
/* Counting the number of decimals
*
* 1. Use Scientific Notation format
* 2. Convert it to a string
* 3. Tokenize it on the exp sign, discard the base part
* 4. convert the second token back to number
*/
int main(){
int counts;
char *sign;
char str[15];
char *base;
char *exp10;
float real = 0.00001;
sprintf (str, "%E", real);
sign= ( strpbrk ( str, "+"))? "+" : "-";
base = strtok (str, sign);
exp10 = strtok (NULL, sign);
counts=atoi(exp10);
printf("[%d]\n", counts);
return 0;
}
Salu2