NaN, Infinity y Divide by Zero en VB.NET

Los libros de programación iniciales generalmente incluyen esta advertencia: "¡No divida por cero! ¡Obtendrá un error de tiempo 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 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

 Console.WriteLine (_

 "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".

 Dim a, b, c como doble

 a = 1: b = 0

 c = a / b

 Console.WriteLine (_

 "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

 Console.WriteLine (_

 "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 _

 Console.WriteLine (_

 "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 punto 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: