Newsgroup: it.comp.lang.c
Titolo: un parere per l'euro

ho bisogno di scrivere alcune funzioncine per la conversione lira/euro
e viceversa...
Ora, secondo voi, e' meglio utilizzare dei double per memorizzare le
variabili o bastano anche float?
NM
A proposito
1 euro == 1936,27 Lire? o
1 euro == 1927,36 Lire?

 variabili o bastano anche float?


 variabili o bastano anche float?
Stai attento che la comunita' europea ha varato delle norme precise circa
le approssimazioni da effettuare nelle conversioni lire/euro euro/lire,
le quali norme prevedono degli arrotondamenti in condizioni particolari.
Pertanto credo che il problema non sia tanto usare float o double, quanto
capire esattamente quali siano le norme, per non scrivere un programma
errato.
Ciao,
Paolo

variabili o bastano anche float?
Meglio usare i double, anche perche' non c'e' motivo per usare float.
ciao, acc.   
a...@libero.it



Io consiglierei di stare alla larga sia da double che da float
e usare piuttosto numero interi esprimendo tutti gli importi
in centesimi di euro.
Il motivo e' che in floating point numeri come 0.01 sono
periodici quando vengono espressi in binario e quindi i calcoli
saranno sempre approssimativi. Detto in altri termini ci
si stanno cercando rogne sugli arrotondamenti.
Ad esempio compilando il seguente programma con BCC55
   #include <stdio.h>
   int main()
   {
     double tot = 0;
     double importo = 0.01;
     int i;
     for (i=0; i<100; i++)
     {
       tot = tot + importo;
     }
     printf("tot = %f \n",tot);
     if (tot == 1.00) printf("tot == 1.00\n");
                 else printf("tot != 1.00\n");
     return 0;
   }
si ottiene il seguente output
   tot = 1.000000
   tot != 1.00
Ovvero la somma di 100 centesimi di Euro e' un numero che
stampato sembra pari a 1 Euro ma che confrontato con un
Euro risulta differente.
HTH
Andrea

 variabili o bastano anche float?
Nessuno dei due
Salva in centesimi (con long)
long v=123456L; // 1234,56
quando visualizzi valori in Euro li dividi per 100
printf("%d,%02d", v/100, v%100);

 le quali norme prevedono degli arrotondamenti in condizioni particolari.
E' vero, io nei programmi che ho sviluppato ho dovuto utilizzare 5 decimali
per le righe di dettaglio e 2 per i totali documento

in centesimi di euro.
Mi pare che i calcoli vadano fatti con 5 cifre decimali. Poi quando
vengono presentati all'utente è necessario usare 2 cifre dopo la
virgola.
-- 
Marco Barisione (ICQ 84277092)

virgola.
Allora usa degli interi ragionando in virgola fissa con
precisione 0.00001; se usi numeri in virgola mobile
basati su notazione binaria di cifre decimali esatte
non ne hai in generale neanche una.
Il problema che volevo far presente e' che con un
double e' gia' impossibile riuscire a rappresentare
correttamente 0.1 (con la notazione fp binaria puoi
rappresentare esattamente solo numeri che siano
multipli interi di una potenza positiva o negativa
di due; e 0.1 non e' uno di questi numeri)
Andrea

correttamente 0.1 [...]
Non ricordarmi queste cose, lunedì ho l'esame di elementi di
informatica e ne sono già stufo :-)
Comunque a NoMan consiglio di cercare con 
groups.google.com
 su
it.comp.programmare, mi ricordo un thread su questo argomento, anche
se non mi ricordo a che conclusioni si era arrivati.


si stanno cercando rogne sugli arrotondamenti.
Sarebbe una buona soluzione, sempreche' il compilatore permetta il
trattamento di interi a 64 bit, viceversa i soliti 32 sono pochini.
Riguardo invece all'uso dei double non c'e' alcun problema, il
problema casomai sta nel modo con cui si effettuano le comparazioni,
come per tutti i floating point i confronti vanno fatti con le dovute
precauzioni. Il problema degli arrotondamenti esiste anche nel caso
degli interi.
ciao, acc.   
a...@libero.it

virgola.
Su quelle specifiche non si parla di cifre decimali, ma di cifre
significative.
ciao, acc.   
a...@libero.it

 trattamento di interi a 64 bit, viceversa i soliti 32 sono pochini.
   La risposta e` "long long int": definito a partire dalla versione C99 
dello standard, su quasi tutte le piattaforme che conosco e` "lungo" 64 bit.
   Ovviamente, non e` la soluzione piu` portabile, che, a mio avviso, e`:
	typedef char currency[15];
con successiva ridefinizione delle tre operazioni contabili piu` usate 
(addizione, sottrazione, percentuale).
-- 
Alla prossima,
Marco