VB.NET'te NaN, Infinity ve Divide Zero

Programlamaya başlayan kitaplar genellikle şu uyarıyı içerir: "Sıfıra bölme! Bir çalışma zamanı hatası alırsınız! "

İşler değişti VB.NET. Daha fazlası olmasına rağmen programlama seçenekler ve hesaplama daha doğrudur, işlerin neden olduğu gibi olduğunu görmek her zaman kolay değildir.

Burada, VB.NET'in yapılandırılmış hata işleme özelliğini kullanarak sıfıra bölme işlemini nasıl yapacağımızı öğreniyoruz. Ve yol boyunca, yeni VB.NET sabitlerini de kapsıyoruz: NaN, Infinity ve Epsilon.

VB.NET'te 'Sıfıra Böl' komutunu çalıştırırsanız ne olur?

VB.NET'te 'sıfıra bölme' senaryosu çalıştırırsanız, bu sonucu alırsınız:

 Dim a, b, c Çift Olarak

 a = 1: b = 0

 c = a / b

 Konsol. Yazı çizgisi( _

 "Matematik kuralları var" _

 & vbCrLf & _

 "yürürlükten kaldırıldı mı?" _

 & vbCrLf & _

 "Sıfıra bölüm " _

 & vbCrLf & _

 "mümkün olmalı!") 

Peki burada neler oluyor? Cevap, VB.NET'in aslında matematiksel olarak doğru cevabı vermesidir. Matematiksel olarak, Yapabilmek sıfıra böl, ama elde ettiğin şey "sonsuz".

 Dim a, b, c Çift Olarak
instagram viewer

 a = 1: b = 0

 c = a / b

 Konsol. Yazı çizgisi( _

 "Cevap: " _

 & c)

 'Görüntüler:

 Cevap: sonsuzluk 

"Sonsuzluk" değeri çoğu iş uygulaması için çok yararlı değildir. (CEO, hisse senedi bonusu üzerindeki üst sınırın ne olduğunu merak etmiyorsa.) Ancak, uygulamalarınızın daha az güçlü diller gibi bir çalışma zamanı istisnasına çarpmasını önler.

VB.NET, hesaplamalar yapmanıza bile izin vererek size daha da fazla esneklik sağlar. Şuna bir bak:

 Dim a, b, c Çift Olarak

 a = 1: b = 0

 c = a / b

 c = c + 1

 'Infinity plus 1

 'hala sonsuzluk 

Matematiksel olarak doğru kalmak için, VB.NET 0/0 gibi bazı hesaplamalar için NaN (Sayı Değil) yanıtı verir.

 Dim a, b, c Çift Olarak

 a = 0: b = 0

 c = a / b

 Konsol. Yazı çizgisi( _

 "Cevap: " _

 & c)

 'Görüntüler:

 Cevap: NaN 

VB.NET ayrıca pozitif sonsuz ve negatif sonsuz arasındaki farkı söyleyebilir:

 Dim a1, a2, b, c Çifte Olarak

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

 (A1 / b)> (a2 / b) ise _

 Konsol. Yazı çizgisi( _

 "Pozitif sonsuzluk" _

 & vbCrLf & _

 "büyüktür" _

 & vbCrLf & _

 "negatif sonsuz.") 

PositiveInfinity ve NegativeInfinity'e ek olarak VB.NET, sıfırdan büyük en küçük pozitif Çift değer olan Epsilon da sağlar.

VB.NET'in tüm bu yeni özelliklerinin yalnızca kayan nokta (Çift veya Tek) veri türleriyle kullanılabileceğini unutmayın. Ve bu esneklik bazı Try-Catch-Son (yapılandırılmış hata işleme) karışıklığına yol açabilir. Örneğin, yukarıdaki .NET kodu herhangi bir istisna atmadan çalışır, bu nedenle bir Try-Catch-Last bloğu içinde kodlanması yardımcı olmaz. Bir bölmeyi sıfıra test etmek için, aşağıdakine benzer bir testi kodlamanız gerekir:

 Eğer c. ToString = "Sonsuzluk" Sonra... 

Programı kodlasanız bile (Tekli veya Çiftli türler yerine Tamsayı kullanarak), yine de "Sıfıra Böl" istisnası değil, "Taşma" Özel Durumunu alırsınız. Web'de diğer teknik yardım için arama yaparsanız, örneklerin hepsinin OverflowException için test edildiğini fark edeceksiniz.

.NET aslında DivideByZeroException meşru bir tür olarak vardır. Ancak kod hiçbir zaman istisnayı tetiklemezse, bu zor hatayı ne zaman göreceksiniz?

DivideByZeroException'ı Ne Zaman Göreceksiniz?

Anlaşıldığı üzere, Microsoft,'ın Try-Catch-nihayet blokları hakkındaki MSDN sayfası aslında bunların nasıl kodlanacağını göstermek için sıfır örnekle bir bölme kullanır. Ama açıklamadıkları ince bir "yakalama" var. Kodları şöyle görünür:

 Bir Tamsayı Dim = 0

 Dim b As Tamsayı = 0

 Dim c As Tamsayı = 0


 Deneyin

 a = b \ c

 İstisna Olarak Hariç Tut

 Konsol. WriteLine ("Bir çalışma zamanı hatası oluştu")

 En sonunda

 Konsol. ReadLine ()

 Son Deneyin 

Bu kod yapar sıfır istisnayla gerçek bir bölünmeyi tetikler.

Ama bu kod neden istisnayı tetikliyor ve daha önce kodladığımız hiçbir şey yok? Microsoft ne açıklamıyor?

Kullandıkları işlemin değil bölme ("/"), tamsayı bölme ("\")! (Diğer Microsoft örnekleri aslında değişkenleri Tamsayı olarak bildirir.) Sonuç olarak, tamsayı hesaplaması bir tek aslında bu istisnayı atar. Microsoft'un (ve kodlarını kopyalayan diğer sayfaların) bu kadar az ayrıntıyı açıklaması güzel olurdu.

instagram story viewer