Natančnost pri računanju v LibreOffice

Inherentni problem natančnosti

LibreOffice Calc tako kot večina drugih elektronskih preglednic uporablja zmožnosti strojne opreme za računanje s števili s plavajočo vejico. Glede na to, da uporablja večina sodobne strojne opreme binarno aritmetiko plavajoče vejice z omejeno natančnostjo, določeno s standardom IEEE 754, številnih decimalnih števil – vključno s tako enostavnim, kot je 0,1 – ni mogoče natančno predstaviti v programu LibreOffice Calc (ki interno uporablja 64-bitna števila z dvojno natančnostjo).

Računanje s temi števili nujno vodi v napake pri zaokrožanju, te pa se z vsakim nadaljnjim izračunom nalagajo.

Ne gre za hrošča, temveč za pričakovano in trenutno neizogibno težavo, če ne uporabljamo kompleksnih izračunov v programski opremi, ki bi povzročila visok davek na hitrost delovanja, zato ne pride v poštev. Uporabniki morajo to upoštevati in po potrebi uporabljati zaokrožanje in primerjave s strojnim epsilonom (ali zaokrožanjem enot).

Primer s števili:

A

1

31000.99

2

32000.12

3

=A1-A2


To pripelje do rezultata -999,129999999997 v A3 namesto pričakovanega -999,13 (morda morate povečati prikazano število decimalk v obliki celic, da to vidite).

Primer z datumi in časi:

Zaradi posebnosti pri predstavljanju časa v programu Calc to velja tudi za vse izračune s časovnimi vrednostmi. Primer: celici A1 in A2 spodaj prikazujeta podatke datuma in časa, kot so vneseni (v standardiziranem zapisu ISO 8601):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


Celica A3 prikaže 00:10:00, če je v celici uporabljeno privzeto oblikovanje [UU]:MM:SS. Vendar celica A3 pokaže tudi 00:09:59,999999 namesto pričakovanega 00:10:00,000000, če je oblikovana z oblikovalnim nizom [UU]:MM:SS,000000. To se zgodi kljub temu, da smo uporabili zgolj cela števila za ure in minute, saj je interno vsak čas ulomek dneva, poldne (12:00) je tako predstavljeno z decimalnim številom 0,5.

Podatki v A1 so interno predstavljeni kot 43934,5125, in v A2 kot 43934,5055555555591126903891563 (kar ni natančna predstavitev vnesene vrednosti datuma in časa, ki bi morala biti 43934,505555555555555555...).

Njuna razlika znaša 0,00694444443287037, kar je rahlo manjša vrednost od pričakovane 0,00694444444444..., kar znese 10 minut.

Podprite nas!