domingo, 4 de agosto de 2013

Errores de Redondeo en Números Reales

Tabla de Contenido

0. Introducción
1. Errores en float, double, y decimal
2. Conclusiones
3. Glosario
4. Referencias

0. Introducción

Esta entrada la voy a dedicar a hablar acerca de los errores más comunes de redondeo de números reales. Es importante conocer este tema cuando estemos manipulando datos resultantes de cálculos científicos, mediciones de fenómenos naturales, o los datos que pudieran producirse a partir cálculos manuales, y que requieran alta precisión.

1. Errores en float, double y decimal

[1] float y double son tipos de datos numéricos internamente representados en base dos (binaria). Por el hecho que estos números son expresados en base binaria, resultan ser representados de forma precisa. De momento, cuando tratamos cuandos literales que poseen parte fraccionaria (3.14159, 2.718281) no pueden ser representados de forma precisa. En el siguiente ejemplo podemos contemplar esto con más detalle.

float decima = 0.1f; // No es 0.1
float uno = 1f;
Console.WriteLine( uno - decima *10F ); // -1.490116E-08

Aquí reside la principal diferencia entre los tipos flotantes float,  double y decimal: los dos primeros no resultan apropiados para operaciones financieras, mientras que decimal puede representar números en base decimal de forma precisa (al igual que sus factores primos: 2 y 5). Para particularizar, un número como 0.1 (en base 10), el tipo de dato real decimal puede representar este número con precisión.

Por otro lado, ni double ni decimal no pueden representar con precisión números con parte fraccionaria recurrente como en:

decimal m = 1M / 6M; // 0.1666666666666666666666666667M
double d = 1.0 / 6.0; // 0.16666666666666666

Cuando operemos con estos números conlleva a la acumulación de errores de redondeo:

decimal decimalErrorRedondeo = m+m+m+m+m+m; // 1.0000000000000000000000000002M
double doubleErrorRedondeo = d+d+d+d+d+d; // 0.99999999999999989

En situaciones en donde se requiera realizar comparaciones u operaciones de igualdad, se presentan irregularidades como estas:

Console.WriteLine(decimalErrorRedondeo == 1M); // False
Console.WriteLine(doubleErrorRedondeo < 1.0); // True

2. Conclusiones

A pesar de la brevedad de esta entrada, hemos aprendido a reconocer algunos de los errores de redondeo tanto en los tipos de datos float y double, como también en decimal. Esto nos resulta importante entenderlo cuando estemos manejando (almacenamiento, tratamiento, procsamiento, visualización y representación) datos sensibles: operaciones financieras, resultados de pruebas académicas, puntajes deportivos, etc.

3. Glosario

- Redondeo

4. Referencias

{1} c# - How can I know if a decimal terminates? - http://stackoverflow.com/questions/8935942/how-can-i-know-if-a-decimal-terminates
[2] C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.