miércoles, 24 de julio de 2013

Valores Float y Double Especiales

Tabla de Contenido

0. Introducción
1. División por Cero
2. División de Cero Entre Cero y Substracción de Infinitos
3. Uso del Operador de Igualdad (==) con Constantes de Punto Flotantes Especiales
4. Otras Operaciones
5. Conclusiones
6. Glosario
7. Referencias

0. Introducción

En esta entrada vamos a tener la oportunidad de hablar acerca de valores especiales (representados como constantes) para los tipos de datos numéricos de punto flotante (float y double). Estos conceptos son importantes introducirlos en esta etapa temprana de la exploración del lenguaje C#, pues nos permitirá comprender el porqué de resultados extraños cuando operamos con valores de los tipos mencionados anteriormente.

Los tipos de datos numéricos de punto flotante float y double se diferencian también de los enteros por algunos valores que son tratados de manera especial en ciertas operaciones. Estos tipos son compatibles con la especificación de formato de tipos de la IEEE 754 [5], la cual es soportada de de manera nativa por todos los microprocesadores.

Estos valores especiales soportados por los dos tipos de datos numéricos de punto flotante son:
  • NaN (Not a Number)
  • +∞
  • -∞
  • -0
Además, las clases tanto float como double poseen constantes para representar estos valores, además de otros valores especiales (MaxValue, MinValue, y Epsilon). Así:

Console.WriteLine(double.NegativeInfinity); // -Infinity

La Tabla 1 muestra las constantes que representan estos valores especiales para los tipos float y double.
Valores especiales de los tipos float y double.
Table 1. Constantes de los Valores Especiales de Tipos Flotantes [4].

1. División por Cero

Al operar con valores de tipo float o double , en particular con la operación división donde el divisor sea cero el resultado será un valor infinito [4][3].


Veamos el siguiente ejemplo en código C#:

Archivo C# DivisionPorCeroValoresInfinitos.cs [enlace alternativo]: 

2. División de Cero Entre Cero y Substracción de Infinitos

Al dividir cero entre cero, o al sustraer infinito de infinito, el resultado es la constante especial NaN (Not a Number, que en español se podría producir como No es un Número[6]. Así:

Console.WriteLine( 0.0 / 0.0 ); // NaN
Console.WriteLine( (1.0 / 0.0 ) - (1.0 / 0.0)); // NaN


Este valor en la jerga matemática son conocidos como valores producidos por expresiones indefinidas. En Wikipedia, en el artículo [3], podemos encontrar una explición muy sencilla sobre el problema que genera este tipo de operaciones en situacionese cotidianas, como el asunto de distribuir/repartir diez galletas entre 0 personas.

3. Uso del Operador de Igualdad con las Constantes Especiales de los Tipos de Punto Flotante

Cuando usamos el operador de igualdad ==, NaN no es igual a cualquier otro valor del espacio de valores de los tipos de datos numéricos float y double, e inclusive al comparar éste con otro NaN.

Observemos esta línea de código:

Console.WriteLine(0.0 / 0.0 == double.NaN); // False


A pesar de que la expresión 0.0 / 0.0 genera un valor NaN, y lo comparamos con la constante NaN de double la evaluación de la expresión de igualdad nos da como resultado False.

4. Otras Operaciones

Los tipos de datos numéricos de punto flotante como float y double cuentan con el método IsNaN para comprobar si una expresión o valor es NaN:

Console.WriteLine(double.IsNaN(0.0 / 0.0)); // True

Por otro lado, cuando usamos el método Equals de Object, dos valores NaN son iguales. Por ejemplo:

Console.WriteLine(double.Equals(0.0 / 0.0, double.NaN)); // True

Nota

La constante NaN es útil para representar, por ejemplo, el valor «Automatic» en medidas de componentes en WPF [7].

5. Conclusiones

Hemos explorado la importancia de valores constantes para los tipos flotantes y su utilidad en la aritmética de expresiones representadas en lenguaje C#. Tenemos ±Infinity para representar el valor resultante de una operación que involucra la división de un número distinto de cero entre cero. Por otro lado, NaN es el resultado de intentar calcular la raíz de un número negativo, y también de la división entre 0 y 0, por ejemplo.

6. Glosario

- IEEE 754
- NaN (Not a Number)
- Punto Flotante
- WPF

7. Referencias

[4] C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[5] IEEE floating point - https://en.wikipedia.org/wiki/IEEE_floating_point
[6] Double.NaN Field (System) - http://msdn.microsoft.com/en-us/library/system.double.nan.aspx
[7] Windows Presentation Foundation - http://en.wikipedia.org/wiki/Windows_Presentation_Foundation


O

No hay comentarios:

Publicar un comentario

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