NaN, Infinity y Divide by Zero en VB.NET

Los libros de programación iniciales generalmente incluyen esta advertencia: "¡No divida por cero! ¡Recibirá un error de tiempo de ejecución! "

Las cosas han cambiado en VB.NET. Aunque hay mas programación opciones 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 cómo 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é sucede si ejecuta 'Divide By Zero' en VB.NET?

Si ejecuta un escenario 'dividir por cero' en VB.NET, obtendrá este resultado:

 Dim a, b, c como doble

 a = 1: b = 0

 c = a / b

 Consola. Línea de escritura( _

 "Tener reglas matemáticas" _

 & vbCrLf & _

 "ha sido derogado?" _ _

 & vbCrLf & _

 "División por cero " _

 & vbCrLf & _

 "debe ser posible!") 

Entonces, ¿qué está pasando aquí? La respuesta es que VB.NET realmente te da la respuesta matemáticamente correcta. Matemáticamente, tú lata divide por cero, pero lo que obtienes es "infinito".

instagram viewer
 Dim a, b, c como doble

 a = 1: b = 0

 c = a / b

 Consola. Línea de escritura( _

 "La respuesta es: " _

 & C)

 'Muestra:

 'La respuesta es: infinito 

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

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

 Dim a, b, c como doble

 a = 1: b = 0

 c = a / b

 c = c + 1

 'Infinity plus 1 es

 'todavía infinito 

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

 Dim a, b, c como doble

 a = 0: b = 0

 c = a / b

 Consola. Línea de escritura( _

 "La respuesta es: " _

 & C)

 'Muestra:

 'La respuesta es: NaN 

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

 Dim a1, a2, b, c como doble

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

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

 Consola. Línea de escritura( _

 "El infinito postivo es" _

 & vbCrLf & _

 "mas grande que" _

 & vbCrLf & _

 "infinito negativo") 

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 solo están disponibles con tipos de datos de coma flotante (doble o simple). Y esta flexibilidad puede generar cierta confusión de Try-Catch-Finalmente (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-Finalmente no ayudará. Para probar una división entre cero, tendría que codificar una prueba como:

 Si c. ToString = "Infinity" Entonces... 

Incluso si codifica el programa (usando Integer en lugar de los tipos Single o Double), aún obtiene una Excepción de "Desbordamiento", no una excepción de "Dividir por Cero". Si busca en la web otra ayuda técnica, notará que todos los ejemplos prueban la Excepción de desbordamiento.

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

Cuándo verá DivideByZeroException

Como resulta, MicrosoftLa página de MSDN sobre los bloques Try-Catch-Finalmente utiliza ejemplos de división entre cero para ilustrar cómo codificarlos. Pero hay una "captura" sutil que no explican. Su código se ve así:

 Dim a As Integer = 0

 Dim b Como entero = 0

 Dim c como entero = 0


 Tratar

 a = b \ c

 Atrapar exc como excepción

 Consola. WriteLine ("Se produjo un error en tiempo de ejecución")

 Finalmente

 Consola. ReadLine ()

 Intento final 

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

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

Tenga en cuenta que la operación que utilizan es no divide ("/"), es entero divide ("\")! (Otros ejemplos de Microsoft en realidad declaran las variables como Entero). Como resultado, el cálculo de enteros es el solamente caso que realmente arroja esa excepción. Hubiera sido bueno que Microsoft (y las otras páginas que copian su código) explicaran ese pequeño detalle.

instagram story viewer