Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Double: cifre decimali e overflow!
Forum - C/C++ - Double: cifre decimali e overflow!

Avatar
Reborn (Normal User)
Newbie


Messaggi: 7
Iscritto: 12/02/2011

Segnala al moderatore
Postato alle 17:08
Martedì, 22/02/2011
Ciao a tutti! Sto scrivendo un programma che calcola risultati in double, ho diversi problemi:
- Come faccio a sapere da quante cifre decimali è composto il numero che inserisco all'esecuzione del programma? Saperlo mi serve per effettuare una stampa corretta, se il risultato è intero, ad esempio, non voglio che mi stampi 6 cifre decimali (0)
- Con alcuni numeri, specie se bassi, la memorizzazione delle variabili non avviene correttamente, se inserisco ad esempio 2.56, nella varabile memorizzata trovo 2.560000002, come mai questo comportamento? Come posso far in modo di considerare solo un massimo di cifre decimali, e di omettere le altre?
- Voglio trovare un modo per avvisare l'utente del programma se si verifica overflow, per ora mi è venuto in mente soltanto di verificare quando il numero diventa negativo (quindi supera la soglia dell'overflow)...se prima era positivo e se in seguito ad un operazione che non sia sottrazione diventa negativo, significa che si è verificato overflow...soluzioni meno grezze?
Grazie mille a tutti per l'aiuto!;)


Il modo migliore per superare una paura è affrontarla!
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 20:22
Martedì, 22/02/2011
il mio consiglio è trattarlo come stringa. Fare tutte le operazione necessarie, magari impostante qualche flag, successivamente lo converti in numero con la funzione atoi() (se è intero) atof() (se è double)


Yep, I came back :P
PM Quote
Avatar
Reborn (Normal User)
Newbie


Messaggi: 7
Iscritto: 12/02/2011

Segnala al moderatore
Postato alle 0:36
Mercoledì, 23/02/2011
Grazie mille!

Ultima modifica effettuata da Reborn il 23/02/2011 alle 0:51


Il modo migliore per superare una paura è affrontarla!
PM Quote
Avatar
Reborn (Normal User)
Newbie


Messaggi: 7
Iscritto: 12/02/2011

Segnala al moderatore
Postato alle 0:48
Mercoledì, 23/02/2011
In tanto mi son informato un pochino, e per decidere quali decimali portarmi dietro, potrei tranquillamente usare prima la ftoa() che mi converte i double in stringa di char, modificarla e poi usare la atof();
o ancora piu semplicemente sostituire la ftoa con una sprintf() e poi la atof(), un problema quindi l'ho risolto grazie a te ;)
Avresti la pazienza di spiegarmi quand'è che un double va in overflow? e un long double? grazie mille.:k:


Il modo migliore per superare una paura è affrontarla!
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 7:48
Mercoledì, 23/02/2011
Vanno in overflow, semplicemente quando superano il valore massimo messo a disposizione dal C. Ecco i valori massimi per ogni dato:
http://www.worldlingo.com/ma/enwiki/it/limits.h


Yep, I came back :P
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:03
Mercoledì, 23/02/2011
Il massimo per un double è 1.7976931348623157 * 10^308, mentre il massimo per un quad è 1.189731495357231765085759326628007 * 10^4932.

Il .0000002 finale non è un errore, ma deriva semplicemente dal fatto che 0.56 non è rappresentabile come somma finita di potenze di due. Infatti è in binario:
0.10000010 (la parte sottolineata è periodica).


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Reborn (Normal User)
Newbie


Messaggi: 7
Iscritto: 12/02/2011

Segnala al moderatore
Postato alle 14:47
Mercoledì, 23/02/2011
Ma è altissimo come valore!!!
Forse ho capito: in precendenza con numeri anche minori di 1000, se inserivo molti decimali, andavo in overflow, ora gli ho fatto prender in considerazioni meno decimali e sembra funzionare meglio (qualcuno mi sa spiegare come mai con numeri alti dopo un pò perde precisione? Vengono memorizzati degli zeri anzichè le cifre delle unità, decinae, e centinaia alcune volte!) Grazie a tutti!
P.S: Un double memorizza 15 decimali giusto?


Il modo migliore per superare una paura è affrontarla!
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:21
Giovedì, 24/02/2011
Meglio che ti studi il formato dei floating point:
http://en.wikipedia.org/wiki/Double_precision_floating-poi ...

Il double ha sempre 52 bit di mantissa, il che equivale circa a 16 cifre in decimale. Tuttavia sono da considerare in notazione scientifica, ossia se hai 1.23456789 avrai 8 decimali, ma in 1.23456789 * 10^10 perderai l'informazione sulle decine e sulle unità (e su tutti i decimali, ovviamente). D'altra parte, questo comportamento è fisicamente accettabile, dato che un valore di 10 ordini di grandezza inferiore non influisce additivamente in modo significativo.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Vinx32 (Normal User)
Newbie


Messaggi: 1
Iscritto: 10/09/2013

Segnala al moderatore
Postato alle 10:53
Domenica, 15/09/2013
Testo quotato

Postato originariamente da Il Totem:

Il massimo per un double è 1.7976931348623157 * 10^308, mentre il massimo per un quad è 1.189731495357231765085759326628007 * 10^4932.

Il .0000002 finale non è un errore, ma deriva semplicemente dal fatto che 0.56 non è rappresentabile come somma finita di potenze di due. Infatti è in binario:
0.10000010 (la parte sottolineata è periodica).



Chiarissimo! grazie!

PM Quote