Print this page
NaN, Infinity y Dividir por cero en VB.NET

NaN, Infinity y Dividir por cero en VB.NET

Los libros de programación para principiantes suelen incluir esta advertencia: "¡No dividas por cero! ¡Obtendrá un error de ejecución!"

 

Las cosas han cambiado en VB.NET. Aunque hay más opciones de programación y el cálculo es más preciso, no siempre es fácil ver por qué las cosas suceden de la manera en que lo hacen.

 

Aquí, aprendemos a manejar la división por cero usando el manejo estructurado de errores de VB.NET. Y en el camino, también cubrimos las nuevas constantes de VB.NET: NaN, Infinity y Epsilon.

Qué pasa si se ejecuta 'Divide por cero' en VB.NET 

Si se ejecuta un escenario de'dividir por cero' en VB.NET, se obtiene este resultado:

 

 Dim a, b, c As Double

a = 1 : b = 0

c = a / b

Console.WriteLine( _

"Have math rules" _

& vbCrLf & _

"been repealed?" _

& vbCrLf & _

"Division by zero " _

& vbCrLf & _

"must be possible!")

 

Entonces, ¿qué está pasando aquí? La respuesta es que VB.NET le da la respuesta matemáticamente correcta. Matemáticamente, se puede dividir por cero, pero lo que se obtiene es "infinito".

 Dim a, b, c As Double

a = 1 : b = 0

c = a / b

Console.WriteLine( _

"The answer is: " _

& c)

' Displays:

' The answer is: infinity

 

El valor "infinito" no es demasiado útil para la mayoría de las aplicaciones empresariales. (A menos que el CEO se pregunte cuál es el límite superior de su bono de acciones.) Pero esto evita que sus aplicaciones se colapsen en una excepción de tiempo de ejecución como lo hacen los lenguajes menos poderosos.

 

VB.NET le da aún más flexibilidad al permitirle incluso realizar cálculos. Mira esto:

 

 Dim a, b, c As Double

a = 1 : b = 0

c = a / b

c = c + 1

' Infinity plus 1 is

' still infinity

Para permanecer matemáticamente correcto, VB.NET le da la respuesta NaN (No un número) para algunos cálculos como 0 / 0.

 

 Dim a, b, c As Double

a = 0 : b = 0

c = a / b

Console.WriteLine( _

"The answer is: " _

& c)

' Displays:

' The answer is: NaN

 

VB.NET también puede diferenciar entre el infinito positivo y el infinito negativo:

 

 Dim a1, a2, b, c As Double

a1 = 1 : a2 = -1 : b = 0

If (a1 / b) > (a2 / b) Then _

Console.WriteLine( _

"Postive infinity is" _

& vbCrLf & _

"greater than" _

& vbCrLf & _

"negative infinity.")

Además de PositiveInfinity y NegativeInfinity, VB.NET también proporciona Epsilon, el valor Doble positivo más pequeño mayor que cero.

 

Tenga en cuenta que todas estas nuevas capacidades de VB.NET sólo están disponibles con tipos de datos en coma flotante (Doble o Simple). Y esta flexibilidad puede llevar a cierta confusión de Try-Catch-Finally (manejo estructurado de errores). Por ejemplo, el código.NET anterior se ejecuta sin lanzar ningún tipo de excepción, por lo que codificarlo dentro de un bloque Try-Catch-Finally no ayudará. Para comprobar si hay una división por cero, tendrías que codificar una prueba algo así como:

 

 If c.ToString = "Infinity" Then ...

 

Incluso si codifica el programa (usando números enteros en lugar de tipos sencillos o dobles), obtendrá una excepción de "desbordamiento", no una excepción de "división por cero". Si busca en la web otra ayuda técnica, notará que todos los ejemplos prueban OverflowException.

NET tiene la DivideByZeroException como un tipo legítimo. Pero si el código nunca desencadena la excepción, ¿cuándo verá este esquivo error?

 

Cuándo verá DivideByZeroException

Resulta que la página MSDN de Microsoft sobre los bloques Try-Catch-Finally utiliza un ejemplo de división por cero para ilustrar cómo codificarlos. Pero hay una sutil "trampa" que no explican. Su código tiene este aspecto:

 

 Dim a As Integer = 0

Dim b As Integer = 0

Dim c As Integer = 0

Try

   a = b \ c

Catch exc As Exception

   Console.WriteLine("A run-time error occurred")

Finally

   Console.ReadLine()

End Try

 

Este código desencadena una división real por excepción cero.

 

Pero, ¿por qué este código activa la excepción y nada de lo que hemos codificado antes lo hace? ¿Y qué es lo que Microsoft no está explicando?

Note que la operación que usan no es dividir ("/"), es dividir entero ("\")! (Otros ejemplos de Microsoft declaran las variables como enteras.) Resulta que el cálculo de números enteros es el único caso que realmente arroja esa excepción. Hubiera sido bueno que Microsoft (y las otras páginas que copian su código) hubieran explicado ese pequeño detalle.

(0 votes)
Creado por SuperredTV el 10/5/2018.