NaN, neskončnost in deljenje z ničlo v VB.NET

Knjige o programiranju za začetnike običajno vključujejo to opozorilo: 'Ne delite z nič! Dobili boste napako med izvajanjem!'





Stvari so se spremenile v VB.NET . Čeprav jih je več programiranje možnosti in je izračun natančnejši, ni vedno lahko ugotoviti, zakaj se stvari zgodijo tako, kot se.

Tukaj se naučimo, kako ravnati z deljenjem z ničlo z uporabo strukturiranega obravnavanja napak VB.NET. Ob tem pa pokrivamo tudi nove konstante VB.NET: NaN, Infinity in Epsilon.



Kaj se zgodi, če v VB.NET zaženete »Deljenje z ničlo«.

Če v VB.NET zaženete scenarij 'deljenja z ničlo', dobite ta rezultat:

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

Torej, kaj se tukaj dogaja? Odgovor je, da vam VB.NET dejansko daje matematično pravilen odgovor. Matematično, ti lahko delite z nič, vendar dobite 'neskončnost'.



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

Vrednost 'neskončno' ni preveč uporabna za večino poslovnih aplikacij. (Razen če se izvršni direktor sprašuje, kakšna je zgornja meja njegovega delniškega bonusa.) Vendar preprečuje, da bi se vaše aplikacije zrušile ob izjemi med izvajanjem, kot to počnejo manj zmogljivi jeziki.

VB.NET vam omogoča še večjo prilagodljivost, saj vam celo omogoča izvajanje izračunov. Poglej to:

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

Da ostane matematično pravilen, vam VB.NET za nekatere izračune, kot je 0 / 0, ponudi odgovor NaN (Ni število).

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

VB.NET zna tudi razlikovati med pozitivno in negativno neskončnostjo:



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

Poleg PositiveInfinity in NegativeInfinity nudi VB.NET tudi Epsilon, najmanjšo pozitivno dvojno vrednost, večjo od nič.

Upoštevajte, da so vse te nove zmožnosti VB.NET na voljo samo s podatki s plavajočo vejico (dvojno ali enojno). In ta prilagodljivost lahko povzroči nekaj zmede Poskusi-Ujemi-Končno (strukturirano obravnavanje napak). Zgornja koda .NET se na primer izvaja brez kakršne koli izjeme, zato njeno kodiranje znotraj bloka Try-Catch-Finally ne bo pomagalo. Če želite preizkusiti deljenje z ničlo, bi morali kodirati test nekaj takega:



|_+_||_+_|

Tudi če kodirate program (z uporabo vrst Integer namesto Single ali Double), še vedno dobite izjemo 'Overflow', ne izjeme 'Divide by Zero'. Če v spletu iščete drugo tehnično pomoč, boste opazili, da vsi primeri testirajo OverflowException.

.NET dejansko ima DivideByZeroException kot legitimen tip. Toda če koda nikoli ne sproži izjeme, kdaj boste videli to izmuzljivo napako?



Ko boste videli DivideByZeroException

Kot se izkaže, Microsoft Stran MSDN o blokih Try-Catch-Finally dejansko uporablja primere deljenja z nič, da ponazori, kako jih kodirati. Vendar obstaja subtilen 'ulov', ki ga ne pojasnijo. Njihova koda izgleda takole:

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

Ta koda naredi sproži dejansko izjemo deljenja z ničlo.



Toda zakaj ta koda sproži izjemo in nič, kar smo prej kodirali, ne? In česa Microsoft ne pojasni?

Upoštevajte, da je operacija, ki jo uporabljajo ne deljenje ('/'), to je celoštevilsko deljenje ('')! (Drugi Microsoftovi primeri dejansko deklarirajo spremenljivke kot Integer.) Kot se je izkazalo, je celoštevilski izračun samo primer, ki dejansko vrže to izjemo. Lepo bi bilo, če bi Microsoft (in druge strani, ki kopirajo njihovo kodo) razložil to majhno podrobnost.