Newsgroup: it.comp.lang.c
Titolo: come contare il numero di cifre dopo la virgola (problema in conversione/troncamento)

Ciao
per divertimento sto facendo una procedura per fare "a mano" una 
divisione, con "infinite" cifre decimali. Lo so che la cosa ï¿œ giï¿œ stata 
fatta, ma appunto ï¿œ un divertimento. Nato, per la cronaca, dal desiderio 
di calcolare 1/243 e controllare se ï¿œ periodico (controllate!).
Farlo con gli interi ï¿œ molto facile, ma volevo estendere l'algoritmo 
anche ai double.
Per farlo, ho bisogno di contare il numero di cifre dopo la virgola, in 
modo che capisco di quale potenza moltiplicativa di 10 ho bisogno 
affinchï¿œ il mio decimale diventi intero. E riapplico il mio vecchio 
algoritmo, salvo rimoltiplicare per lo stesso fattore di prima...etc. etc.
Ora, per fare questo uso un algoritmo iterativo che confronta il double 
con il suo casting int (la sua conversione a int con un (int)). Se i 
numeri sono uguali, significa che il double originale ï¿œ intero. 
Altrimenti provo moltiplicando per 10, e rifaccio il confronto. E cosï¿œ via.
Un alternativa al casting ï¿œ l'uso di "trunc"  (o truncl, o tutte queste 
cose belle).
La cosa, ahimï¿œ, non cambia. Arrivato a 5 cifre decimali circa il 
confronto "sballa". Sembrerebbe che la gestione in bit degli int e dei 
double, e la loro reciproca conversione, abbia delle "grosse" 
limitazioni. Non mi va di mettermi a studiare dove stia il problema, 
tanto non lo posso risolvere. Mi capita che ad un certo punto un 
75463457 si debba confrontare con un 75463456 (notare l'ultima cifra), 
perchï¿œ la conversione non ha funzionato, ha approssimato male. E la cosa 
mi capita un po' a caso...spesso non serve aumentare il numero di cifre 
dopo la virgola, ma basta aumentare il numero di cifre significative totali.
Come ho detto, non mi interessa la motivazione esatta.
Vorrei a questo punto un indicazione su come costruirmi da solo un 
algoritmo che mi consenta di contare le cifre decimali dopo la virgola.
Qualcosa che, dato 7.21 mi dica "2" e 345345.036 mi dica "3"...e cosï¿œ via.
Il nostro cervello vede al volo che tra i numeri c'ï¿œ un carattere che un 
numero non ï¿œ, una virgola...
Ma cosa potrei fare? Forse dovrei veramente andarmi a studiare il 
sistema di rappresentazione dei double e SPERARE che ci sia qualche 
singolo bit da controllare che, magari elaborato in un qualche modo, mi 
dia il numero di cifre dopo la virgola (IN DECIMALE!)? La vedo molto 
difficile...
Idee? Grazie :-)
-- 
 >Giovanni

 difficile...
ciao.
Quello che stai cercando di ottenere e' praticamente impossibile:
Il problema viene dalla rappresentazione interna dei numeri in virgola
mobile, che fa si che il concetto di "numero di cifre dopo la virgola"
non abbia senso. (
http://en.wikipedia.org/wiki/Floating_point
)
Quando tu scrivi, ad esempio, 0.1 tu *credi* di memorizzare un numero
con una cifra dopo la virgola, ma in realta' il computer memorizza
al suo interno qualcosa tipo 0.100000000000000005551115123125782...
che e' il numero "piu' vicino" a 0.1 che e' in grado di rappresentare
in formato floating point.
Come vedi, alla faccia delle due cifre decimali... :)
ciao
Giacomo

 "3"...e cos� via.
Io convertirei il numero in una stringa e conterei i caratteri dal '.' al 
null terminator.
Cristiano 

 in formato floating point.
d'accordo...ma a me sta bene contare il numero delle cifre dopo la 
virgola nella sua rappresentazione decimale. anzi, vorrei proprio 
bypassare la sua gestione binaria per evitare di fare quegli errori che 
fa lui.
senno' che faccio?
leggo un numero come stringa...e poi lo analizzo direttamente come 
stringa...lo converto "a mano" in intero...e poi faccio tutto come se 
fosse un intero?
sï¿œ, potrebbe essere un'idea. domani ci provo.
-- 
 >Giovanni

 null terminator.
sï¿œ questa idea mi era venuta in mente proprio stasera...
ora ï¿œ un po' tardi per provarci...magari domani.
poi quando ho finito, posto la mia "fatica" (che poi sarï¿œ una mezza 
stronzata sicuramente :-))))) ).
-- 
 >Giovanni

 sï¿œ, potrebbe essere un'idea. domani ci provo.
Si, direi che devi adottare un'altra notazione: quella che dici tu puo'
andare, memorizzando i numeri come stringhe di sicuro non hai problemi
di rappresentazione.
ciao
G