Precisão de cálculos do LibreOffice

O problema da precisão inerente

O LibreOffice Calc, assim como a maioria dos outros softwares de planilha, utiliza recursos matemáticos de ponto flutuante disponíveis no hardware. Dado que a maioria dos hardwares contemporâneos utiliza a aritmética binária de ponto flutuante com precisão limitada definida no padrão IEEE 754, muitos números decimais - incluindo aqueles tão simples quanto 0,1 - não podem ser representados com precisão no LibreOffice Calc (que utiliza números de dupla precisão de 64 bits internamente).

Cálculos com esses números forçosamente resultam em erros de arredondamento, e esses erros acumulam a cada cálculo subsequente.

Isso não chega a ser um bug, mas é esperado e é atualmente inevitável sem a utilização de cálculos complexos feitos em software, o que incorreria em penalidades de desempenho inadequadas e, portanto, está fora de questão. Os usuários precisam saber disso e usar arredondamentos e comparações com o épsilon da máquina (ou unidade de arredondamento), quando necessário.

Um exemplo numérico:

A

1

31000.99

2

32000.12

3

=A1-A2


Isso resultará em -999,129999999997 em A3, em vez do esperado -999,13 (talvez seja necessário aumentar as casas decimais mostradas no formato de célula para que seja visto).

Um exemplo com datas e horas:

Devido à natureza da representação de tempo no Calc, aplica-se também a todos os cálculos envolvendo horas. Por exemplo, as células A1 e A2 abaixo mostram os dados de data e hora conforme inseridos (em formato ISO 8601):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


A célula A3 mostrará 00:10:00 se a formatação padrão [HH]:MM:SS for aplicada à célula. No entanto, a célula A3 mostrará 00:09:59.999999 em vez do esperado 00:10:00.000000 caso formatada usando a string de formato [HH]:MM:SS.000000. Isso acontece apesar de serem utilizados apenas números inteiros de horas e minutos, pois internamente qualquer hora é uma fração de um dia, sendo 12:00 (meio-dia) representado como 0,5.

Os dados em A1 são representados internamente como 43934.5125, e em A2 como 43934.5055555555591126903891563 (que não é uma representação exata da data e hora inserida, a qual seria 43934.505555555555555555...).

A subtração resulta em 0,00694444443287037, um valor ligeiramente menor que o esperado 0,00694444444444..., que corresponde a 10 minutos.

♥ Doe para nosso projeto! ♥