Newsgroup: it.comp.lang.c
Titolo: approssimazione errata dei double ???

il problema è il seguente: prendo un input tramite
scanf("%f",&x) 
dove x è dichiarato come double.Se faccio stampare x fino alla 9a cifra
decimale, trovo un brutta sorpresa, ovvero x =3.000000479, inaccettabile
per gli scopi del mio programma.
Ovviamente posso arrotondare x con rint(x), ma vorrei capire il perchè di
questo "errore" (se così si può chiamare) nell'assegnazione dei double (e
vale solo per i double, o anche per altri tipi di variabili????)
Grazie

 vale solo per i double, o anche per altri tipi di variabili????)
Solo per i double: i tipi interi hanno valori esatti compresi fra un
minimo e un massimo. Ovviamente, se esci da questi limiti, ottieni valori
*completamente* privi di senso.
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 conosco (a parte le mie, aziendali, che però non posso certo dare in giro).
Le GMP dovrebbero essere la soluzione a questo:
http://swox.com/gmp/
Pero' non avendole mai usate, non so dire :)
-- 
Mat/tia Belletti - Graduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

 
http://swox.com/gmp/
Altrimenti soluzione naive: prendi un long e lo dividi * 10^n quando
li visualizzi, dove n è la tua precisione. 
onofrio panzarino ICQ UIN: 147911980
for PGP pub key send me an email with 'send key pub' in the
subject line
-- 
"The  erroneous idea  that  Ibid is  the  author of  the  Lives is  so
frequently  met with,  even  among  those pretending  to  a degree  of
culture, that it is worth correcting. Ibid's masterpiece, on the other
hand, was the famous Op. Cit."                      HP Lovecraft, Ibid

 
Non direi proprio. Credo che la soluzione sia il package decNumber:
http://www.alphaworks.ibm.com/tech/decNumber
ciao
Ale


Magari dire anche il _perche'_ sarebbe stato piu' costruttivo, non credi? :)
-- 
Mat/tia Belletti              - Graduate student @ 
cs.unibo.it
ICQ: 33292311                 - email: 
mbel...@cs.unibo.it
IRC: RedGlow                  - site(s): 
http://mbellett.web.cs.unibo.it/
Red...@jabber.linux.it/Gaim
  - Linux registered user 299762 @ machine 
213003

 arrotondato (talvolta in modo per me un po' incomprensibile),
I numeri non interi vengono "conservati" in memoria in un modo un pò 
"particolare". Dei 32 bit che di solito sono utilizzati per un float 
(almeno su architetture x86) uno è utilizzato per il segno, 8 per 
l'esponente e 23 per la mantissa.
La mantissa rappresenta le cifre significative del numero, l'esponente 
indica l'ordine di grandezza o dove metter la virgola.
Esempio:
Mantissa  011101101
Esponente 3
Numero    011,101101
Potrei aver commesso delle imprecisioni ma la storia funziona in questo 
modo.
Vantaggio:
Questo sistema permette di indicare numeri molto grandi e molto piccoli
da numeri dell'ordine di 2^-128 a numeri dell'ordine di 2^127 
utilizzando un numero raggionevole di bit
Svantaggio:
Questo modo non permette di rappresentare ESATTAMENTE i numeri, inoltre 
a causa operazioni di certi tipi si possono perdere cifre significative
e avere un'informazione sempre meno valida, cmq credo che questo esuli 
dalla domanda...
Mi scuso se non sono stato chiarissimo e/o non preciso