Precisión de cálculos en LibreOffice

Problema de precisión inherente

LibreOffice Calc, al igual que la mayoría de los programas de hojas de cálculo, utiliza las capacidades matemáticas de punto flotante disponibles en el hardware. Dado que la mayoría del hardware contemporáneo utiliza la aritmética binaria de punto flotante con una precisión limitada definida en el estándar IEEE 754, muchos números decimales -incluso tan simples como 0,1- no pueden representarse con precisión en LibreOffice Calc (que utiliza internamente números de doble precisión de 64 bits).

Los cálculos con esos números necesariamente resultan en errores de redondeo, y éstos se acumulan con cada cálculo.

No se trata de un error, sino que es algo esperado y actualmente inevitable si no se utilizan cálculos complejos en el software, lo que supondría una penalización inadecuada del rendimiento, y por tanto está fuera de lugar. Los usuarios deben tenerlo en cuenta y utilizar el redondeo y las comparaciones con epsilon de la maquina (o redondeo de unidades) según sea necesario.

Un ejemplo con números:

A

1

31000.99

2

32000.12

3

=A1-A2


Esto dará como resultado -999.129999999997 en A3, en lugar del esperado -999.13 (puede que tengas que aumentar los decimales mostrados en el formato de celda para ver esto).

Un ejemplo con fechas y horas:

Debido a la especificidad de la representación de la hora en Calc, esto también se aplica a todos los cálculos que implican tiempos. Por ejemplo, las celdas A1 y A2 de abajo muestran los datos de fecha y hora tal y como se han introducido (en formato ISO 8601):

A

1

2020-04-13 12:18:00

2

2020-04-13 12:08:00

3

=A1-A2


La celda A3 mostrará 00:10:00 si se aplica el formato por defecto [HH]:MM:SS a la celda. Sin embargo, la celda A3 mostrará 00:09:59.999999 en lugar del esperado 00:10:00.000000 si se aplica el formato [HH]:MM:SS.000000. Esto sucede a pesar de que sólo se utilizaron números enteros de horas y minutos, porque internamente, cualquier hora es una fracción de un día, siendo las 12:00 (mediodía) representadas como 0,5.

Los datos en A1 se representan internamente como 43934.5125, y en A2 como 43934.50555555591126903891563 (que no es la representación exacta de la fecha introducida, que sería 43934.505555555555...).

Su sustracción da como resultado 0,00694444443287037, un valor ligeramente inferior al esperado 0,006944444444..., que es de 10 minutos.

¡Necesitamos su ayuda!