NaN, Бесконечность и деление на ноль в VB.NET

Начинающие книги по программированию обычно включают это предупреждение: «Не делите на ноль! Вы получите ошибку во время выполнения! "

Вещи изменились в VB.NET. Хотя есть еще программирование варианты и расчет более точный, не всегда легко понять, почему все происходит так, как они.

Здесь мы узнаем, как обрабатывать деление на ноль, используя структурированную обработку ошибок VB.NET. Кроме того, мы рассмотрим новые константы VB.NET: NaN, Infinity и Epsilon.

Что произойдет, если вы запустите «Разделить на ноль» в VB.NET

Если вы запустите сценарий «деление на ноль» в VB.NET, вы получите такой результат:

 Дим а, б, в как дубль

 а = 1: б = 0

 с = а / б

 Приставка. WriteLine (_

 "Есть математические правила" _

 & vbCrLf & _

 "был отменен?" _

 & vbCrLf & _

 "Деление на ноль " _

 & vbCrLf & _

 "должно быть возможно!") 

Так что здесь происходит? Ответ в том, что VB.NET фактически дает вам математически правильный ответ. Математически ты мочь разделите на ноль, но вы получите «бесконечность».

 Дим а, б, в как дубль
instagram viewer

 а = 1: б = 0

 с = а / б

 Приставка. WriteLine (_

 "Ответ: " _

 и с)

 Отображает:

 «Ответ: бесконечность 

Значение "бесконечность" не слишком полезно для большинства бизнес-приложений. (Если генеральный директор не задается вопросом, каков верхний предел его бонуса акций.) Но он не дает вашим приложениям зависать при исключении времени выполнения, как это делают менее мощные языки.

VB.NET дает вам еще большую гибкость, даже позволяя выполнять расчеты. Проверь это:

 Дим а, б, в как дубль

 а = 1: б = 0

 с = а / б

 с = с + 1

 Бесконечность плюс 1

 'еще бесконечность 

Чтобы оставаться математически правильным, VB.NET дает вам ответ NaN (не число) для некоторых вычислений, таких как 0/0.

 Дим а, б, в как дубль

 а = 0: б = 0

 с = а / б

 Приставка. WriteLine (_

 "Ответ: " _

 и с)

 Отображает:

 Ответ: NaN 

VB.NET также может определить разницу между положительной бесконечностью и отрицательной бесконечностью:

 Dim a1, a2, b, c как двойной

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

 Если (a1 / b)> (a2 / b), то _

 Приставка. WriteLine (_

 «Позитивная бесконечность» _

 & vbCrLf & _

 "больше чем" _

 & vbCrLf & _

 "отрицательная бесконечность.") 

В дополнение к PositiveInfinity и NegativeInfinity, VB.NET также предоставляет Epsilon, наименьшее положительное значение Double больше нуля.

Помните, что все эти новые возможности VB.NET доступны только для типов данных с плавающей запятой (Double или Single). И эта гибкость может привести к некоторой путанице Try-Catch-Наконец (структурированная обработка ошибок). Например, приведенный выше код .NET выполняется без каких-либо исключений, поэтому кодирование его внутри блока Try-Catch-finally не поможет. Чтобы проверить деление на ноль, вы должны написать код теста:

 Если с. ToString = "Бесконечность" Тогда... 

Даже если вы закодируете программу (используя Integer вместо Single или Double), вы все равно получите исключение «переполнение», а не исключение «деление на ноль». Если вы будете искать в Интернете другую техническую помощь, вы заметите, что все примеры проверяют наличие OverflowException.

На самом деле .NET имеет DivideByZeroException в качестве допустимого типа. Но если код никогда не вызывает исключение, когда вы когда-нибудь увидите эту неуловимую ошибку?

Когда вы увидите DivideByZeroException

Как выясняется, MicrosoftСтраница MSDN о блоках Try-Catch-finally фактически использует примеры деления на ноль, чтобы показать, как их кодировать. Но есть тонкая «загвоздка», которую они не объясняют. Их код выглядит так:

 Dim a As Integer = 0

 Dim b As Integer = 0

 Dim c As Integer = 0


 Пытаться

 a = b \ c

 Catch exc As Exception

 Приставка. WriteLine («Произошла ошибка во время выполнения»)

 в заключение

 Приставка. ReadLine ()

 Конец попробовать 

Этот код делает вызвать фактическое деление на ноль исключений.

Но почему этот код вызывает исключение, а ничто из того, что мы кодировали раньше, не делает? А что Microsoft не объясняет?

Обратите внимание, что операция, которую они используют не делить ("/"), это целочисленное деление ("\")! (Другие примеры Microsoft фактически объявляют переменные как целочисленные.) Как оказалось, целочисленные вычисления только случай, который на самом деле бросает это исключение. Было бы хорошо, если бы Microsoft (и другие страницы, которые копируют их код) объяснили эту маленькую деталь.

instagram story viewer