NaN, Infinity a dělení nulou ve VB.NET

Počáteční programovací knihy obvykle obsahují toto varování: „Nerozdělte nulou! Získáte runtime chybu! “

Věci se změnily v VB.NET. I když jich je víc programování možnosti a výpočet je přesnější, není vždy snadné pochopit, proč se věci dějí tak, jak to dělají.

Zde se naučíme, jak zpracovat dělení nulou pomocí strukturovaného zpracování chyb VB.NET. A po cestě také pokrýváme nové konstanty VB.NET: NaN, Infinity a Epsilon.

Co se stane, když ve VB.NET spustíte „Rozdělit podle nuly“

Pokud ve VB.NET spustíte scénář dělení nulou, získáte tento výsledek:

 Dim a, b, c jako Double

 a = 1: b = 0

 c = a / b

 Řídicí panel. WriteLine (_

 "Mít matematická pravidla" _

 & vbCrLf & _

 "bylo zrušeno?" _

 & vbCrLf & _

 "Dělení nulou " _

 & vbCrLf & _

 „musí být možné!“) 

Tak co se tady děje? Odpověď zní, že VB.NET vám dává matematicky správnou odpověď. Matematicky, vy umět vydělte nulou, ale získáte „nekonečno“.

 Dim a, b, c jako Double

 a = 1: b = 0

 c = a / b

 Řídicí panel. WriteLine (_

 "Odpověď je: " _

 & c)

 'Zobrazuje:

 „Odpověď zní: nekonečno 

instagram viewer

Hodnota „nekonečno“ není pro většinu podnikových aplikací příliš užitečná. (Pokud se generální ředitel nezajímá, jaký je horní limit jeho akciového bonusu.) Ale to zabrání tomu, aby vaše aplikace padaly na runtime výjimku jako méně výkonné jazyky.

VB.NET vám dává ještě větší flexibilitu tím, že dokonce umožňuje provádět výpočty. Koukni na tohle:

 Dim a, b, c jako Double

 a = 1: b = 0

 c = a / b

 c = c + 1

 „Infinity plus 1 je

 "stále nekonečno." 

Aby zůstala matematicky správná, VB.NET vám dává odpověď NaN (Not a Number) pro některé výpočty, jako je 0/0.

 Dim a, b, c jako Double

 a = 0: b = 0

 c = a / b

 Řídicí panel. WriteLine (_

 "Odpověď je: " _

 & c)

 'Zobrazuje:

 „Odpověď zní: NaN 

VB.NET může také rozeznat rozdíl mezi kladnou a zápornou nekonečno:

 Dim a1, a2, b, c Jako Double

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

 Pokud (a1 / b)> (a2 / b), pak _

 Řídicí panel. WriteLine (_

 "Postive nekonečno je" _

 & vbCrLf & _

 "větší než" _

 & vbCrLf & _

 „negativní nekonečno“.) 

Kromě PositiveInfinity a NegativeInfinity poskytuje VB.NET také Epsilon, nejmenší kladnou dvojitou hodnotu větší než nula.

Mějte na paměti, že všechny tyto nové možnosti VB.NET jsou k dispozici pouze s datovými typy s pohyblivou řádovou čárkou (Double nebo Single). A tato flexibilita může vést k určitému zmatení metodou Try-Catch-Final (strukturované zpracování chyb). Například výše uvedený kód .NET běží bez vyvolání jakékoli výjimky, takže jeho kódování uvnitř bloku Try-Catch-Final nepomůže. Chcete-li otestovat dělení nulou, museli byste testovat kód jako:

 Pokud c. ToString = "Infinity" Pak... 

I když kód programujete (pomocí Integer namísto Single nebo Double typů), stále dostanete výjimku „přetečení“, nikoli výjimku „Rozdělit nulou“. Pokud prohledáváte na webu další technickou pomoc, všimnete si, že všechny příklady testují OverflowException.

NET má ve skutečnosti DivideByZeroException jako legitimní typ. Ale pokud kód nikdy nespustí výjimku, kdy uvidíte tuto nepolapitelnou chybu?

Když uvidíte divideByZeroException

Jak se ukazuje, MicrosoftStránka MSDN o blocích Try-Catch-Nakonec ve skutečnosti používá dělení nulovými příklady pro ilustraci, jak je kódovat. Ale je tu jemný „úlovek“, který nevysvětlují. Jejich kód vypadá takto:

 Dim a In Inger = 0

 Dim b jako celé číslo = 0

 Dim c As Integer = 0


 Snaž se

 a = b \ c

 Catch exc jako výjimka

 Řídicí panel. WriteLine ("Došlo k chybě při běhu")

 Konečně

 Řídicí panel. ReadLine ()

 Ukončete pokus 

Tento kód ano spouští skutečné dělení nulovou výjimkou.

Ale proč tento kód vyvolává výjimku a nic, co jsme předtím kódovali, neudělá? A co Microsoft nevysvětluje?

Všimněte si, že operace, kterou používají ne dělení ("/"), je to celé dělení ("\")! (Jiné příklady společnosti Microsoft skutečně deklarují proměnné jako celé číslo.) Jak se ukazuje, výpočet celého čísla je pouze případ, který skutečně vyvolá tuto výjimku. Bylo by hezké, kdyby Microsoft (a další stránky, které kopírují jejich kód) vysvětlily tento malý detail.