Oppure

Loading
22/02/11 16:08
Reborn
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!;)
aaa
22/02/11 19:22
Pitagora
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)
aaa
22/02/11 23:36
Reborn
Grazie mille!
Ultima modifica effettuata da Reborn 22/02/11 23:51
aaa
22/02/11 23:48
Reborn
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:
aaa
23/02/11 6:48
Pitagora
Vanno in overflow, semplicemente quando superano il valore massimo messo a disposizione dal C. Ecco i valori massimi per ogni dato:
worldlingo.com/ma/enwiki/it/…
aaa
23/02/11 10:03
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).
aaa
23/02/11 13:47
Reborn
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?
aaa
24/02/11 10:21
Il Totem
Meglio che ti studi il formato dei floating point:
en.wikipedia.org/wiki/…

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.
aaa