NaN, Infinity και Divide by Zero στο VB.NET

Αρχίζοντας τα βιβλία προγραμματισμού συνήθως περιλαμβάνουν αυτή την προειδοποίηση: "Μην διαιρείτε με το μηδέν! Θα λάβετε ένα σφάλμα χρόνου εκτέλεσης! "

Τα πράγματα έχουν αλλάξει VB.NET. Παρόλο που υπάρχουν περισσότερα προγραμματισμός επιλογές και ο υπολογισμός είναι ακριβέστερος, δεν είναι πάντα εύκολο να καταλάβετε γιατί συμβαίνουν τα πράγματα με τον τρόπο που κάνουν.

Εδώ, μαθαίνουμε πώς να χειριστούμε τη διαίρεση με το μηδέν με τη δομημένη διαχείριση σφαλμάτων του VB.NET. Και κατά μήκος του δρόμου, καλύπτουμε επίσης τις νέες σταθερές VB.NET: NaN, Infinity και Epsilon.

Τι συμβαίνει εάν εκτελέσετε το "Διαίρεση κατά μηδέν" στο VB.NET

Εάν εκτελέσετε ένα σενάριο 'διαίρεσης κατά μηδέν' στο VB.NET, παίρνετε αυτό το αποτέλεσμα:

 Dim a, b, c Ως διπλό

 α = 1: b = 0

 c = α / β

 Κονσόλα. WriteLine (_

 "Έχουν κανόνες μαθηματικών" _

 & vbCrLf & _

 "καταργήθηκε;" _

 & vbCrLf & _

 "Διαίρεση με το μηδέν " _

 & vbCrLf & _

 "πρέπει να είναι δυνατή!") 

Τι συμβαίνει εδώ; Η απάντηση είναι ότι το VB.NET στην πραγματικότητα σας δίνει τη μαθηματική ορθή απάντηση. Μαθηματικά, εσύ

instagram viewer
μπορώ χωρίστε από το μηδέν, αλλά αυτό που παίρνετε είναι "άπειρο".

 Dim a, b, c Ως διπλό

 α = 1: b = 0

 c = α / β

 Κονσόλα. WriteLine (_

 "Η απάντηση είναι: " _

 & γ)

 ' Οθόνες:

 «Η απάντηση είναι: άπειρο 

Η τιμή "άπειρο" δεν είναι πολύ χρήσιμη για τις περισσότερες επιχειρηματικές εφαρμογές. (Εκτός αν ο Διευθύνων Σύμβουλος αναρωτιέται ποιο είναι το ανώτατο όριο για το μπόνους μετοχών του). Αλλά κρατάει τις εφαρμογές σας από τη συντριβή σε μια εξαίρεση εκτέλεσης χρόνου εκτέλεσης όπως οι λιγότερο ισχυρές γλώσσες.

Το VB.NET σας δίνει ακόμα μεγαλύτερη ευελιξία επιτρέποντάς σας ακόμη και να κάνετε υπολογισμούς. Κοίτα αυτό:

 Dim a, b, c Ως διπλό

 α = 1: b = 0

 c = α / β

 c = c + 1

 'Infinity plus 1 είναι

 'ακόμα άπειρο 

Για να παραμείνετε σωστά μαθηματικά, το VB.NET σας δίνει την απάντηση NaN (Not a Number) για ορισμένους υπολογισμούς όπως 0/0.

 Dim a, b, c Ως διπλό

 α = 0: b = 0

 c = α / β

 Κονσόλα. WriteLine (_

 "Η απάντηση είναι: " _

 & γ)

 ' Οθόνες:

 «Η απάντηση είναι: NaN 

Το VB.NET μπορεί επίσης να πει τη διαφορά ανάμεσα στο θετικό άπειρο και το αρνητικό άπειρο:

 Dim a1, a2, b, c Ως διπλό

 α1 = 1: α2 = -1: b = 0

 Αν (a1 / b)> (a2 / b) Στη συνέχεια _

 Κονσόλα. WriteLine (_

 "Το θετικό άπειρο είναι" _

 & vbCrLf & _

 "μεγαλύτερος από" _

 & vbCrLf & _

 "αρνητικό άπειρο.") 

Εκτός από το PositiveInfinity και το NegativeInfinity, το VB.NET παρέχει επίσης την Epsilon, τη μικρότερη θετική διπλή τιμή μεγαλύτερη από το μηδέν.

Λάβετε υπόψη ότι όλες αυτές οι νέες δυνατότητες του VB.NET είναι διαθέσιμες μόνο με τύπους δεδομένων με κυμαινόμενο σημείο (διπλό ή μονό). Και αυτή η ευελιξία μπορεί να οδηγήσει σε κάποια σύγχυση Try-Catch-Finally (δομημένο σφάλμα). Για παράδειγμα, ο παραπάνω κώδικας .NET τρέχει χωρίς να ρίχνει κανενός είδους εξαίρεση, οπότε η κωδικοποίησή του μέσα σε ένα μπλοκ Try-Catch-Finally δεν θα βοηθήσει. Για να δοκιμάσετε ένα χάσμα με μηδέν, θα πρέπει να κωδικοποιήσετε ένα τεστ όπως:

 Εάν γ. ToString = "Infinity" Στη συνέχεια... 

Ακόμα κι αν κωδικοποιείτε το πρόγραμμα (χρησιμοποιώντας το Ακέραιο αντί για τους τύπους Single ή Double), εξακολουθείτε να έχετε μια εξαίρεση "Υπέρβαση", όχι εξαίρεση "Διαίρεση κατά μηδέν". Αν ψάχνετε στον ιστό για άλλη τεχνική βοήθεια, θα παρατηρήσετε ότι όλα τα παραδείγματα δοκιμάζονται για OverflowException.

Το .NET στην πραγματικότητα έχει το DivideByZeroException ως νόμιμο τύπο. Αλλά αν ο κώδικας δεν ενεργοποιεί ποτέ την εξαίρεση, πότε θα δείτε ποτέ αυτό το αόριστο λάθος;

Όταν θα δείτε DivideByZeroException

Οπως φαίνεται, Microsoft's MSDN σχετικά με τα μπλοκ Try-Catch-Finally χρησιμοποιεί πραγματικά ένα παράδειγμα με μηδενική διαίρεση για να απεικονίσει τον τρόπο κωδικοποίησης τους. Αλλά υπάρχει ένα λεπτό "αλιευμάτων" που δεν εξηγούν. Ο κώδικας τους μοιάζει με αυτό:

 Dim a ως ακέραιο = 0

 Dim b Ως ακέραιο = 0

 Dim c Ως ακέραιος = 0


 Δοκιμάστε

 a = b \ c

 Παγίδα exc As Exception

 Κονσόλα. WriteLine ("Παρουσιάστηκε σφάλμα χρόνου εκτέλεσης")

 Τελικά

 Κονσόλα. ReadLine ()

 Δοκιμάστε το τέλος 

Αυτός ο κώδικας κάνει ενεργοποιούν ένα πραγματικό χάσμα με μηδενική εξαίρεση.

Αλλά γιατί ο κώδικας αυτός ενεργοποιεί την εξαίρεση και τίποτα που έχουμε κωδικοποιήσει πριν κάνει; Και τι δεν εξηγεί η Microsoft;

Παρατηρήστε ότι η λειτουργία που χρησιμοποιούν είναι δεν διαιρέστε ("/"), διαιρείται ακέραια ("\")! (Άλλα παραδείγματα της Microsoft δηλώνουν στην πραγματικότητα τις μεταβλητές ως Integer.) Όπως αποδεικνύεται, ο υπολογισμός ακέραιας είναι ο μόνο περίπτωση που πραγματικά ρίχνει την εξαίρεση αυτή. Θα ήταν ωραίο αν η Microsoft (και οι άλλες σελίδες που αντιγράφουν τον κώδικα τους) εξήγησαν αυτές τις μικρές λεπτομέρειες.

instagram story viewer