Accuratezza di calcolo in LibreOffice

Problema di accuratezza intrinseca

LibreOffice Calc, come la maggior parte degli altri programmi per fogli di calcolo, utilizza le capacità matematiche in virgola mobile disponibili sull'hardware. Poiché la maggior parte dell'hardware contemporaneo utilizza l'aritmetica binaria in virgola mobile con precisione limitata definita nello standard IEEE 754, molti numeri decimali, compresi quelli semplici come 0,1, non possono essere rappresentati con precisione in LibreOffice Calc (che utilizza internamente numeri a doppia precisione a 64 bit).

I calcoli con questi numeri comportano necessariamente errori di arrotondamento, che si accumulano a ogni calcolo.

Questo non è un errore, ma è previsto e attualmente inevitabile senza ricorrere a calcoli complessi nel software, che comporterebbero penalizzazioni inappropriate delle prestazioni, e quindi è fuori discussione. Gli utenti devono tenerne conto e utilizzare gli arrotondamenti e i confronti con l'Epsilon di macchina (o arrotondamento unitario) laddove necessario.

Un esempio con i numeri:

A

1

31000.99

2

32000.12

3

=A1-A2


Questo restituirĂ  nella cella A3 -999,129999999997 al posto dell'atteso -999,13 (potrebbe essere necessario incrementare il numero di cifre decimali per visualizzarlo).

Un esempio con date e ore:

A causa della specifica rappresentazione del tempo in Calc, questo si applica anche ai calcoli relativi agli spazi temporali. Per esempio, le sottostanti celle A1 e A2 mostrano la data e l'ora come sono state inserite (nel formato ISO 8601):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


La cella A3 mostrerà 00:10:00 se alla cella viene applicata la formattazione predefinita [HH]:MM:SS. Tuttavia, la cella A3 mostrerà 00:09:59.999999 invece delle previste 00:10:00.000000 se viene formattata con la stringa di formato [HH]:MM:SS.000000. Questo accade nonostante siano stati utilizzati solo numeri interi di ore e minuti, perché internamente qualsiasi ora è una frazione di giorno, essendo le 12:00 (mezzogiorno) rappresentate come 0,5.

I dati in A1 sono rappresentati internamente come 43934,5125 e in A2 come 43934,5055555555591126903891563 (che non è la rappresentazione esatta del tempo inserito, che sarebbe 43934,50555555555555 periodico).

La loro sottrazione dĂ  come risultato 0,00694444443287037, un valore leggermente inferiore al previsto 0,0069444444 periodico, che corrisponde a 10 minuti.

Sostienici!