Точность вычисления 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 (возможно в формате ячейки потребуется увеличить отображаемое число разрядов после десятичной точки для отображения этого числа).

An example with dates and times:

Due to the specific of time representation in Calc, this also applies to all calculations involving times. For example, the cells A1 and A2 below show the date and time data as entered (in ISO 8601 format):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


Cell A3 will show 00:10:00 if the default formatting [HH]:MM:SS is applied to the cell. However, cell A3 will show 00:09:59.999999 instead of expected 00:10:00.000000 if formatted using [HH]:MM:SS.000000 format string. This happens despite only whole numbers of hours and minutes were used, because internally, any time is a fraction of a day, 12:00 (noon) being represented as 0.5.

The data in A1 is represented internally as 43934.5125, and in A2 as 43934.5055555555591126903891563 (which is not exact representation of the entered datetime, which would be 43934.505555555555555555...).

Their subtraction results in 0.00694444443287037, a value slightly less than expected 0.00694444444444..., which is 10 minutes.