Computerwissenschaften

NaN, Infinity und Divide by Zero in VB.NET

Zu Beginn beginnen Programmierbücher normalerweise die Warnung: „Teilen Sie nicht durch Null! Es wird ein Laufzeitfehler angezeigt!“

In VB.NET haben sich die Dinge geändert . Obwohl es mehr Programmieroptionen gibt und die Berechnung genauer ist, ist es nicht immer leicht zu erkennen, warum die Dinge so ablaufen, wie sie ablaufen.

Hier lernen wir, wie man mit der Division durch Null mit der strukturierten Fehlerbehandlung von VB.NET umgeht. Unterwegs behandeln wir auch die neuen VB.NET-Konstanten: NaN, Infinity und Epsilon.

 

Was passiert, wenn Sie in VB.NET ‚Divide By Zero‘ ausführen?

Wenn Sie in VB.NET ein Szenario „Durch Null teilen“ ausführen, erhalten Sie folgendes Ergebnis:


 Dim a, b, c As Double

 

 a=1: b=0

 

 c=a / b

 

 Console.WriteLine (_

 

 "Haben Sie mathematische Regeln" _

 

 & vbCrLf & _

 

"aufgehoben worden?" _

 

 & vbCrLf & _

 

 "Durch Null teilen " _

 

 & vbCrLf & _

 

 "muss möglich sein!")

Also, was ist hier los? Die Antwort ist, dass VB.NET Ihnen tatsächlich die mathematisch korrekte Antwort gibt. Mathematisch Sie können durch Null teilen, aber was man bekommt , ist „unendlich“.


 Dim a, b, c As Double

 

 a=1: b=0

 

 c=a / b

 

 Console.WriteLine (_

 

 "Die Antwort ist: " _

 

 & c)

 

 'Anzeigen:

 

 Die Antwort lautet: Unendlichkeit

Der Wert „unendlich“ ist für die meisten Geschäftsanwendungen nicht allzu nützlich. (Es sei denn, der CEO fragt sich, wie hoch die Obergrenze für seinen Aktienbonus ist.) Es verhindert jedoch, dass Ihre Anwendungen bei einer Laufzeitausnahme abstürzen, wie dies bei weniger leistungsfähigen Sprachen der Fall ist.

VB.NET bietet Ihnen noch mehr Flexibilität, indem Sie sogar Berechnungen durchführen können. Überprüfen Sie dies heraus:


 Dim a, b, c As Double

 

 a=1: b=0

 

 c=a / b

 

 c=c + 1

 

 'Unendlichkeit plus 1 ist

 

 'immer noch unendlich

Um mathematisch korrekt zu bleiben, gibt Ihnen VB.NET die Antwort NaN (Not a Number) für einige Berechnungen wie 0/0.


 Dim a, b, c As Double

 

 a=0: b=0

 

 c=a / b

 

 Console.WriteLine (_

 

 "Die Antwort ist: " _

 

 & c)

 

 'Anzeigen:

 

 Die Antwort lautet: NaN

VB.NET kann auch den Unterschied zwischen positiver und negativer Unendlichkeit erkennen:


 Dim a1, a2, b, c As Double

 

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

 

 Wenn (a1 / b)> (a2 / b), dann _

 

 Console.WriteLine (_

 

 "Postive Unendlichkeit ist" _

 

 & vbCrLf & _

 

 "größer als" _

 

 & vbCrLf & _

 

 "negative Unendlichkeit.")

Neben PositiveInfinity und NegativeInfinity bietet VB.NET auch Epsilon, den kleinsten positiven Double-Wert größer als Null.

Beachten Sie, dass all diese neuen Funktionen von VB.NET nur mit Gleitkomma-Datentypen (Double oder Single) verfügbar sind. Und diese Flexibilität kann zu Verwirrung bei Try-Catch-finally (strukturierte Fehlerbehandlung) führen. Beispielsweise wird der obige .NET-Code ohne Ausnahme ausgeführt, sodass das Codieren in einem Try-Catch-finally-Block nicht hilft. Um eine Division durch Null zu testen, müssten Sie einen Test wie folgt codieren:


 Wenn c.ToString="Infinity", dann ...

Selbst wenn Sie das Programm codieren (mit Integer anstelle von Single- oder Double-Typen), erhalten Sie immer noch eine „Overflow“ -Ausnahme, keine „Divide by Zero“ -Ausnahme. Wenn Sie im Internet nach anderer technischer Hilfe suchen, werden Sie feststellen, dass alle Beispiele auf OverflowException testen.

.NET hat tatsächlich die DivideByZeroException als legitimen Typ. Aber wenn der Code niemals die Ausnahme auslöst, wann werden Sie jemals diesen schwer fassbaren Fehler sehen?

 

Wenn Sie DivideByZeroException sehen

Wie sich herausstellt, verwendet die MSDN-Seite von Microsoft zu Try-Catch-finally-Blöcken tatsächlich Beispiele für die Division durch Null, um zu veranschaulichen, wie sie codiert werden. Aber es gibt einen subtilen „Haken“, den sie nicht erklären. Ihr Code sieht folgendermaßen aus:


 Dim a As Integer=0

 

 Dim b As Integer=0

 

 Dim c As Integer=0

 


 

 Versuchen

 

a=b \ c

 

 Catch exc als Ausnahme

 

Console.WriteLine ("Ein Laufzeitfehler ist aufgetreten")

 

 Endlich

 

Console.ReadLine ()

 

 Versuch beenden

Dieser Code hat eine tatsächliche Division durch Null Ausnahme auslösen.

Aber warum löst dieser Code die Ausnahme aus und nichts, was wir zuvor codiert haben, tut dies? Und was erklärt Microsoft nicht?

Beachten Sie, dass die von ihnen verwendete Operation nicht dividieren („/“), sondern ganzzahlig dividieren („\“) ist! (Andere Microsoft-Beispiele deklarieren die Variablen tatsächlich als Ganzzahl.) Wie sich herausstellt, ist die Ganzzahlberechnung der einzige Fall, der diese Ausnahme tatsächlich auslöst. Es wäre schön gewesen, wenn Microsoft (und die anderen Seiten, die ihren Code kopieren) dieses kleine Detail erklärt hätten.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.