Точност на изчисленията в LibreOffice

Присъщ проблем с точността

LibreOffice Calc, точно както повечето други програми за електронни таблици, разчита на възможностите на хардуера за изчисления с плаваща запетая. Тъй като повечето съвременен хардуер използва двоична аритметика с плаваща запетая с ограничена точност, дефинирана от стандарта IEEE 754, много десетични числа – включително толкова прости като 0,1 – не могат да бъдат точно представени в LibreOffice Calc (който вътрешно използва 64-битови числа с двойна точност).

Пресмятанията с тези числа неизбежно водят до грешки от закръгляване, които се натрупват с всяко изчисление.

Това не е дефект, а нещо очаквано и за момента неизбежно без използване на сложни софтуерни изчисления, което би влошило неприемливо бързодействието и поради това е неприложимо. Потребителите трябва да имат това предвид и при необходимост да използват закръгляване и сравняване с машинен епсилон.

Пример с числа:

A

1

31000.99

2

32000.12

3

=A1-A2


Това ще даде резултат -999,129999999997 в A3 вместо очакваното -999,13 (може да се наложи да увеличите показваните дробни позиции във формата на клетката, за да видите числото).

Пример с дати и часове:

Поради спецификата на представянето на часове в Calc, това важи и за всички изчисления с часове. Например в клетките A1 и А2 по-долу се виждат данни за дата и час, както са въведени (във формат ISO 8601):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


В клетката A3 ще се покаже 00:10:00, ако върху нея е приложено подразбираното форматиране [HH]:MM:SS. В същата клетка A3 обаче ще се покаже 00:09:59,999999 вместо очакваното 00:10:00,000000, ако се използва форматиращ низ [HH]:MM:SS,000000. Това става въпреки използването само на цели числа за часовете и минутите, защото вътрешно всеки час е дробна част от деня, като 12:00 (пладне) се представя като 0,5.

Данните в A1 се представят вътрешно като 43934,5125, а тези в A2 – като 43934,5055555555591126903891563 (което не е точно представяне на въведената дата и час, то би било 43934,505555555555555555...).

Разликата им е 0,00694444443287037 – стойност, малко по-малка от очакваната 0,00694444444444..., която отговаря на 10 минути.

Моля, подкрепете ни!