NaN, infinito e dividido por zero no VB.NET

Os livros de programação iniciais geralmente incluem este aviso: "Não divida por zero! Você receberá um erro de tempo de execução! "

As coisas mudaram em VB.NET. Embora haja mais programação opções e o cálculo é mais preciso, nem sempre é fácil ver por que as coisas acontecem do jeito que acontecem.

Aqui, aprendemos como lidar com a divisão por zero usando o tratamento de erros estruturados do VB.NET. E ao longo do caminho, também abordamos as novas constantes do VB.NET: NaN, Infinity e Epsilon.

O que acontece se você executar 'Divide By Zero' no VB.NET

Se você executar um cenário 'dividir por zero' no VB.NET, obterá este resultado:

 Dim a, b, c Como duplo

 a = 1: b = 0

 c = a / b

 Console. WriteLine (_

 "Tenha regras matemáticas" _

 & vbCrLf & _

 "foi revogado?" _

 & vbCrLf & _

 "Divisão por zero " _

 & vbCrLf & _

 "deve ser possível!") 

Então, o que está acontecendo aqui? A resposta é que o VB.NET realmente fornece a resposta matematicamente correta. Matematicamente, você pode divida por zero, mas o que você obtém é "infinito".

instagram viewer
 Dim a, b, c Como duplo

 a = 1: b = 0

 c = a / b

 Console. WriteLine (_

 "A resposta é: " _

 & c)

 'Exibe:

 'A resposta é: infinito 

O valor "infinito" não é muito útil para a maioria dos aplicativos de negócios. (A menos que o CEO esteja se perguntando qual é o limite superior de seu bônus em ações.) Mas isso impede que seus aplicativos falhem em uma exceção de tempo de execução, como fazem as linguagens menos poderosas.

O VB.NET oferece ainda mais flexibilidade, permitindo que você faça cálculos. Veja isso:

 Dim a, b, c Como duplo

 a = 1: b = 0

 c = a / b

 c = c + 1

 'Infinito mais 1 é

 ainda infinito 

Para permanecer matematicamente correto, o VB.NET fornece a resposta NaN (Não é um número) para alguns cálculos como 0/0.

 Dim a, b, c Como duplo

 a = 0: b = 0

 c = a / b

 Console. WriteLine (_

 "A resposta é: " _

 & c)

 'Exibe:

 'A resposta é: NaN 

O VB.NET também pode dizer a diferença entre infinito positivo e infinito negativo:

 Dim a1, a2, b, c Como duplo

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

 Se (a1 / b)> (a2 / b) Então _

 Console. WriteLine (_

 "O infinito positivo é" _

 & vbCrLf & _

 "Maior que" _

 & vbCrLf & _

 "infinito negativo") 

Além de PositiveInfinity e NegativeInfinity, o VB.NET também fornece Epsilon, o menor valor duplo positivo maior que zero.

Lembre-se de que todos esses novos recursos do VB.NET estão disponíveis apenas com tipos de dados de ponto flutuante (duplo ou único). E essa flexibilidade pode levar a alguma confusão Try-Catch-Finalmente (manipulação estruturada de erros). Por exemplo, o código .NET acima é executado sem gerar nenhum tipo de exceção, portanto, codificá-lo dentro de um bloco Try-Catch-Finalmente não ajudará. Para testar uma divisão por zero, você teria que codificar um teste como:

 Se c. ToString = "Infinito" Então... 

Mesmo se você codificar o programa (usando o número inteiro em vez dos tipos simples ou duplo), você ainda receberá uma exceção "Overflow", não uma exceção "Divide by Zero". Se você pesquisar na web por outra ajuda técnica, notará que todos os exemplos testam OverflowException.

Na verdade, o .NET possui o DivideByZeroException como um tipo legítimo. Mas se o código nunca acionar a exceção, quando você verá esse erro indescritível?

Quando você verá DivideByZeroException

Como se vê, MicrosoftA página do MSDN sobre blocos Try-Catch-Finalmente na verdade usa exemplos de divisão por zero para ilustrar como codificá-los. Mas há um "problema" sutil que eles não explicam. O código deles fica assim:

 Dim a As Inteiro = 0

 Dim b As Inteiro = 0

 Dim c como inteiro = 0


 Experimentar

 a = b \ c

 Catch exc As Exception

 Console. WriteLine ("Ocorreu um erro em tempo de execução")

 Finalmente

 Console. Leia a linha()

 Finalizar tentativa 

Este código faz acionar uma divisão real por zero exceção.

Mas por que esse código aciona a exceção e nada que codificamos antes? E o que a Microsoft não está explicando?

Observe que a operação que eles usam é não divide ("/"), é um número inteiro dividido ("\")! (Outros exemplos da Microsoft realmente declaram as variáveis ​​como Inteiro.) Como se vê, o cálculo inteiro é o caso que realmente lança essa exceção. Seria bom se a Microsoft (e as outras páginas que copiam seu código) explicasse esses pequenos detalhes.

instagram story viewer