|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2004
Città: Nord-Est
Messaggi: 5158
|
[C++] LEggo e riscrivo dei numeri, ma sono diversi, perche'?
Ciao.
In un programmino che sto facendo mi sono reso conto di una cosa un po' strana. LEggo dei dati da un file txt, li memorizzo in una matrice e poi li riscrivo su file. Il problema e' che alcuni dati sono un po' diversi, ad esempio: leggo (e nella matrice trovo): 1,1,85483.91500,445116.58800,52.7 1,2,85490.33800,445119.24950,53 ma quando li scrivo su file ottengo: 1,1,85483.914999999994,445116.58799999999,52.700000000000003 1,2,85490.338000000003,445119.24949999998,53 Praticamente le differenze sono nulle, pero' non capisco come mai sono diversi. La matrice e' una matrice dinamica di long double. Come mai accade cio? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
La memorizzazione di numeri a virgola mobile nelle memorie dei computer comporta sempre a variazioni leggere del numero in questione.
Purtroppo il calcolo di numeri reali su PC (al contrario degli interi) sono soggetti ad errori di approssimazione per via del limite dell'Hardware. Ciao EDIT: Detto questo in futuro cerca di evitare espressioni tipo : if (numero_float == 0.0) //Fai qualcosa In quanto c'è possibilità che questa condizione non si avveri mai anche se la situazione sembra ovvia
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2004
Città: Nord-Est
Messaggi: 5158
|
In passato non mi sono mai accorto di questa cosa, anzi, credo non mi sia mai capitata...
Edit: Nel programma uso 3 o 4 volte un if(valore float == qualcosa) then...., pero' sono controlli per evitare buffer overflow o per modificare casi patologici, quali ad esempio il coefficiente angolare pari a 0, da cui la sua retta perpendicolare avrebbe m pari ad infinito. Ultima modifica di Abadir_82 : 11-02-2008 alle 13:50. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
prova a leggerli come stringhe
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Se è invece per decidere una condizione di esecuzione no. Ad esempio fare una cosa tipo while (angle != 0.0) { // FA QUALCOSA angle -= 1.0; } (dove angle è un float o double) può portare a loop infiniti Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Feb 2004
Città: Nord-Est
Messaggi: 5158
|
Quote:
Ps. I dati li leggo gia' come strighe. Li converto poi in numeri. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Per fare i controlli come quello di esempio non usare mai == , usa >= o <= . Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:12.