NaN, begalybė ir padalijimas iš nulio VB.NET

Pradedančiose programavimo knygose paprastai yra toks įspėjimas: „Nedalinkite iš nulio! Gausite vykdymo laiko klaidą!'





Viskas pasikeitė VB.NET . Nors yra ir daugiau programavimas parinktys ir skaičiavimas yra tikslesnis, ne visada lengva suprasti, kodėl viskas vyksta taip, kaip vyksta.

Čia sužinome, kaip tvarkyti padalijimą iš nulio naudojant VB.NET struktūrinių klaidų tvarkymą. Be to, mes taip pat apimame naujas VB.NET konstantas: NaN, Infinity ir Epsilon.



Kas atsitiks, jei VB.NET paleisite funkciją „Padalyti iš nulio“.

Jei VB.NET vykdote scenarijų „padalyti iš nulio“, gausite šį rezultatą:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Taigi, kas čia vyksta? Atsakymas yra tas, kad VB.NET iš tikrųjų pateikia matematiškai teisingą atsakymą. Matematiškai tu gali padalinkite iš nulio, bet tai, ką gausite, yra „begalybė“.



|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Vertė „begalybė“ nėra per daug naudinga daugeliui verslo programų. (Nebent generaliniam direktoriui kyla klausimas, kokia yra viršutinė jo akcijų premijos riba.) Tačiau tai neleidžia jūsų programoms sugesti dėl vykdymo laiko išimties, kaip tai daro mažiau galingos kalbos.

VB.NET suteikia dar daugiau lankstumo, nes netgi leidžia atlikti skaičiavimus. Pažiūrėk:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Kad išliktų matematiškai teisingas, VB.NET pateikia atsakymą NaN (ne skaičius) kai kuriems skaičiavimams, pvz., 0 / 0.

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

VB.NET taip pat gali pasakyti skirtumą tarp teigiamos begalybės ir neigiamos begalybės:



|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Be PositiveInfinity ir NegativeInfinity, VB.NET taip pat teikia Epsilon – mažiausią teigiamą dvigubą vertę, didesnę už nulį.

Atminkite, kad visos šios naujos VB.NET galimybės pasiekiamos tik naudojant slankiojo kablelio (dvigubo arba vieno) duomenų tipus. Ir šis lankstumas gali sukelti painiavą „Try-Catch-Finally“ (struktūrinis klaidų apdorojimas). Pavyzdžiui, aukščiau pateiktas .NET kodas veikia be jokių išimčių, todėl jo kodavimas bloke Try-Catch-Finally nepadės. Norėdami patikrinti, ar dalijimasis iš nulio, turėtumėte užkoduoti testą, pavyzdžiui:



|_+_||_+_|

Net jei užkoduosite programą (naudodami sveikąjį skaičių, o ne vieną arba dvigubą tipus), vis tiek gausite „perpildymo“ išimtį, o ne „Padalinti iš nulio“ išimtį. Jei ieškote žiniatinklyje kitos techninės pagalbos, pastebėsite, kad visi pavyzdžiai tikrina „OverflowException“.

.NET iš tikrųjų turi DivideByZeroException kaip teisėtą tipą. Bet jei kodas niekada nesukelia išimties, kada pamatysite šią sunkiai suprantamą klaidą?



Kai pamatysite DivideByZeroException

Kaip paaiškėja, Microsoft MSDN puslapyje apie „Try-Catch-Finally“ blokus iš tikrųjų naudojamas padalijimas iš nulio, kad parodytų, kaip juos koduoti. Tačiau yra subtilus „pagautas“, kurio jie nepaaiškina. Jų kodas atrodo taip:

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Šis kodas daro suaktyvinti faktinį padalijimą iš nulio.



Bet kodėl šis kodas suaktyvina išimtį, o niekas, ką anksčiau kodavome, nedaro? O ko Microsoft nepaaiškina?

Atkreipkite dėmesį, kad jų naudojama operacija yra ne padalinti ('/'), tai sveikasis skaičius padalijimas ('')! (Kiti Microsoft pavyzdžiai iš tikrųjų deklaruoja kintamuosius kaip sveikąjį skaičių.) Kaip paaiškėja, sveikųjų skaičių apskaičiavimas yra tik atvejis, kuris iš tikrųjų daro tą išimtį. Būtų buvę puiku, jei „Microsoft“ (ir kiti puslapiai, kopijuojantys jų kodą) paaiškintų šią smulkmeną.