LibreOffice-kalkuleringssnøyaktighet

Iboende nøyaktighetsproblem

LibreOffice Calc, akkurat som de fleste andre regnearkprogramvare, bruker flytende-punkts matematiske funksjoner tilgjengelig på maskinvare. Gitt at de fleste moderne maskinvare bruker binær flyttalls-aritmetikk med begrenset presisjon definert i IEEE 754-standarden, mange desimaltall – inkludert som enkel som 0.1 - kan ikke representeres nøyaktig i LibreOffice Calc (som bruker 64-bits dobbelpresisjonstall internt).

Beregninger med disse tallene resultater nødvendigvis i avrundingsfeil, og de akkumuleres med hver beregning.

Dette er ikke en feil, men er forventet og for øyeblikket uunngåelig uten å bruke komplekse beregninger i programvare, noe som vil medføre upassende ytelsesstraff, og er derfor uaktuelt. Brukere må ta hensyn til det, og bruke avrunding og sammenligninger med maskin-epsilon (eller enhetsavrunding) etter behov.

Et eksempel med tall:

A

1

31000.99

2

32000.12

3

=A1-A2


Dette vil resultere i -999.129999999997 i A3, i stedet for forventet -999.13 (det kan hende du må øke viste desimaler i celleformat for å se dette).

Et eksempel med datoer og klokkeslett:

På grunn av den spesifikke tidsrepresentasjonen i Calc, gjelder dette også for alle beregninger som involverer tider. For eksempel viser cellene A1 og A2 nedenfor dato- og klokkeslettdataene som er angitt (i ISO 8601-format):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


Celle A3 vil vise 00:10:00 hvis standardformateringen [TT]:MM:SS brukes på cellen. Imidlertid vil celle A3 vise 00:09:59.999999 i stedet for forventet 00:10:00.000000 hvis formatert med [HH]:MM:SS.000000 formatstreng. Dette skjer til tross for at bare hele antall timer og minutter ble brukt, fordi internt er enhver tid en brøkdel av en dag, 12:00 (middag) representert som 0,5.

Dataene i A1 er representert internt som 43934.5125, og i A2 som 43934.505555555591126903891563 (som ikke er eksakt representasjon av den angitte dato og klokkeslett, som vil være 43934.50555555555...).

Deres subtraksjon resulterer i 0,006944444443287037, en verdi litt mindre enn forventet 0,00694444444444..., som er 10 minutter.

Supporter oss!