[bglug] Excel sbaglia i conti, ahimè anche OpenOffice

Diego mlpita@bergamo3.it
Gio 21 Ago 2008 17:01:34 CEST


In data Thu, 21 Aug 2008 16:13:56 +0200,  ha scritto:

> In data Thu, 21 Aug 2008 16:10:42 +0200, i Berta  
> <iberta.caravaggio@tiscali.it> ha scritto:
>
>> Scusa, ma a cosa ti serve il formato personalizzato? usando un formato
>> NUMERO con 9 DECIMALI  mi sembri che Excel faccia i calcoli esatti.

Mi spiace, ma te ne dovrai fare una ragione!

Purtroppo non ho potuto verificare sul foglio che hai mandato perchè non  
ho un decopressore per 7z ma il fatto che i fogli di calcolo sbaglino i  
conti è intrinseco nel modo con cui vengono rappresentati i numeri nel  
computer.

Dirò una cosa ovvia per molti, ma magari qualcuno la troverà interessante.

Sul computer i numeri con la virgola vengono memorizzati all' interno di  
un gruppo di bit la cui quantità è fissa (generalmente 32 o 64 bit) con i  
quali, nel caso di usare 32 bit, si possono memorizzare 2^32 (cioè  
4'294'967'296) valori diversi.

In pratica possiamo memorizzare tutti i numeri INTERI da 0 a  
4'294'967'295, oppure tutti i numeri INTERI da -2147483648 a +2147483647,  
oppure se volessimo potremmo memorizzare tutti i numeri INTERI che vanno  
da -1147483648 a +3147483647, resta il fatto che in totale potremmo  
rappresentare "solamente" 4'294'967'296 valori diversi.

Ora sappiamo tutti che tra due numeri interi diversi (es. 0 e 1) ci  
possono essere invece infiniti numeri con la virgola e che non sarà mai  
possibile rappresentarli tutti utilizzando un numero finito di bit.

Il computer però usa un numero finito di bit anche per rappresentare i  
numeri con la virgola, e per far ciò usa un trucchetto: una parte dei 32  
bit li usa per memorizzare un numero intero, come ad esempio il numero  
"273613" ed un altra parte la usa per memorizzare la posizione della  
virgola su questo numero, permettendoci quindi di rappresentare  
"0,00273613", "0,273613", "2,73613", "273,613" etc etc

Resta il fatto che in tutto con 32 bit potrà rappresentare 2^32 valori  
diversi e quindi buona parte di quell' infinità di valori con la virgola  
li dovrà approssimare. Non solo.... proprio per i limiti intrinseci di  
questo tipo di rappresentazione il computer non riesce a memorizzare con  
precisione alcuni valori apparentemente molto semplici, come 0,1 (vedi  
approfondimenti).

Ecco il perchè dei tuoi calcoli sbagliati!

Ciao, Diego


Per approfondire:
http://it.wikipedia.org/wiki/Virgola_mobile (Quello che ho detto io ma in  
maniera più tecnica)
http://it.wikipedia.org/wiki/IEEE_754
http://support.microsoft.com/kb/78113/en-us (Floating-point arithmetic may  
give inaccurate results in Excel)
http://www.cpearson.com/excel/rounding.htm (Rounding Errors In Microsoft  
Excel)


Maggiori informazioni sulla lista bglug