НаН, Инфинити и подјела од нула у ВБ.НЕТ

Почетне књиге о програмирању обично укључују ово упозорење: „Не дели се на нулу! Добићете грешку током извршавања! "

Ствари су се промијениле ВБ.НЕТ. Иако их има више програмирање опције и израчунавање је тачније, није увек лако видети зашто се ствари одвијају онако како раде.

Овде смо научили како да поделимо дељење са нулом користећи ВБ.НЕТ структуирано руковање грешкама. Уз пут, покривамо и нове ВБ.НЕТ константе: НаН, Инфинити и Епсилон.

Шта се догађа ако у ВБ.НЕТ покренете „Дивиде Би Зеро“

Ако у ВБ.НЕТ покренете сценарио „подели са нулом“, добићете овај резултат:

 Дим а, б, ц Као двоструко

 а = 1: б = 0

 ц = а / б

 Конзола. ВритеЛине (_

 "Имајте математичка правила" _

 & вбЦрЛф & _

 "је опозван?" _

 & вбЦрЛф & _

 "Подељење по нули" _

 & вбЦрЛф & _

 "мора бити могуће!") 

Па шта се овде догађа? Одговор је да ВБ.НЕТ заправо даје математички тачан одговор. Математички, ти моћи подели са нулом, али оно што добијеш је "бесконачност".

 Дим а, б, ц Као двоструко

 а = 1: б = 0

 ц = а / б

 Конзола. ВритеЛине (_

 "Одговор је: " _

 & ц)

 'Приказује:

 Одговор је: бесконачност 

instagram viewer

Вредност "бесконачност" није превише корисна за већину пословних апликација. (Осим ако се генерални директор не пита која је горња граница његовог додатног улога.) Али то спречава да се ваше апликације руше на изузећу током извођења као што то чине мање моћни језици.

ВБ.НЕТ вам даје још већу флексибилност чак и омогућавајући вам да обављате прорачуне. Види ово:

 Дим а, б, ц Као двоструко

 а = 1: б = 0

 ц = а / б

 ц = ц + 1

 'Бесконачност плус 1 је

 'још увек бесконачност 

Да бисте остали математички тачни, ВБ.НЕТ вам даје одговор НаН (а не број) за неке прорачуне као што је 0/0.

 Дим а, б, ц Као двоструко

 а = 0: б = 0

 ц = а / б

 Конзола. ВритеЛине (_

 "Одговор је: " _

 & ц)

 'Приказује:

 Одговор је: НаН 

ВБ.НЕТ такође може открити разлику између позитивне бесконачности и негативне бесконачности:

 Дим а1, а2, б, ц Као двоструко

 а1 = 1: а2 = -1: б = 0

 Ако је (а1 / б)> (а2 / б) тада _

 Конзола. ВритеЛине (_

 "Постивна бесконачност је" _

 & вбЦрЛф & _

 "веће од" _

 & вбЦрЛф & _

 "негативна бесконачност.") 

Поред ПоситивеИнфинити и НегативеИнфинити, ВБ.НЕТ нуди и Епсилон, најмању позитивну Доубле вредност већу од нуле.

Имајте на уму да су све ове нове могућности ВБ.НЕТ доступне само са типовима података с помичним зарезом (Доубле или Сингле). А ова флексибилност може довести до неке збрке Три-Цатцх-Енд (структурирано руковање грешкама). На пример, .НЕТ код изнад ради без бацања било какве изнимке, тако да га кодирање унутар блока Три-Цатцх-Енд неће помоћи. Да бисте тестирали поделу са нулом, морали бисте да кодирате тест попут:

 Ако ц. ТоСтринг = "Бесконачност" Затим... 

Чак и ако програм кодирате (користећи Интегер уместо Сингле или Доубле типова), и даље добијате изузетак „Оверфлов“, а не „Дивиде би Зеро“ изузетак. Ако на вебу тражите другу техничку помоћ, примијетит ћете да сви примјери тестирају ОверфловЕкцептион.

.НЕТ заправо има ДивидеБиЗероЕкцептион као легитиман тип. Али ако код никада не покрене изузетак, када ћете икада видети ову неухватљиву грешку?

Када ћете видети ДивидеБиЗероЕкцептион

Како се испоставило, МицрософтМСДН страница о Три-Цатцх-Енд блоковима користи примене поделе на нулу да би илустрирала како их кодирати. Али постоји суптилан „улов“ који они не објашњавају. Њихов код изгледа овако:

 Дим а Ас Интегер = 0

 Дим б као цели број = 0

 Дим ц као цели број = 0


 Покушати

 а = б \ ц

 Ухватите искључење као изузетак

 Конзола. ВритеЛине ("Дошло је до грешке приликом извођења времена")

 Коначно

 Конзола. РеадЛине ()

 Заустави покушај 

Овај код заиста покреће стварну поделу са нултим изузетком.

Али зашто овај код покреће изузетак и ништа што смо прије кодирали? А шта Мицрософт не објашњава?

Примјетите да је операција коју они користе не подијели ("/"), то је цијели број подијели ("\")! (Остали Мицрософтови примери заправо декларишу променљиве као Интегер.) Како се испоставило, израчунавање целих бројева је само случај који заправо баца ту изузетак. Било би лијепо када би Мицрософт (и остале странице које копирају код) објаснили тај мали детаљ.