Warum gibt diese Methode double.PositiveInfinity nicht DivideByZeroException zurück?

8

Ich habe das folgende Snippet in der VS2015 C # interaktiv ausgeführt und ein sehr merkwürdiges Verhalten bekommen.

%Vor%

Warum hat die Methode Unendlichkeit zurückgegeben, während 3/0 einen Fehler und 3 / b einen Formationsfehler ausgelöst hat? Kann ich erzwingen, dass die Division einen Fehler geworfen hat, anstatt unendlich zurückzugeben?

Wenn ich die Methode zu

umformatiere %Vor%

würde die neue DivideByZeroException die gleichen Informationen und die gleiche Struktur enthalten wie die abgefangene Ausnahme?

    
Kelson Ball 25.07.2016, 19:57
quelle

4 Antworten

14
___ qstntxt ___

Ich habe das folgende Snippet in der VS2015 C # interaktiv ausgeführt und ein sehr merkwürdiges Verhalten bekommen.

%Vor%

Warum hat die Methode Unendlichkeit zurückgegeben, während 3/0 einen Fehler und 3 / b einen Formationsfehler ausgelöst hat? Kann ich erzwingen, dass die Division einen Fehler geworfen hat, anstatt unendlich zurückzugeben?

Wenn ich die Methode zu

umformatiere %Vor%

würde die neue DivideByZeroException die gleichen Informationen und die gleiche Struktur enthalten wie die abgefangene Ausnahme?

    
___ answer38576534 ___

Wie bereits oben erwähnt, liegt es an Ihnen, dass Sie double als Divisor verwenden. Sie können es beweisen, indem Sie das Beispiel Ihrer Variablen verwenden, aber NaN anstelle von %code% verwenden.

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123exceptionhandling ___ Bei der Ausnahmebehandlung handelt es sich um ein Programmiersprachenkonstrukt oder einen Computerhardwaremechanismus, der das Auftreten von Exceptions behandelt, spezielle Bedingungen, die den normalen Ablauf der Programmausführung ändern. ___ answer38576465 ​​___

Es liegt daran, dass Sie System.Double verwenden.

Wie von MSDN DivideByZeroException wird nur für ganzzahlige Typen und Decimal ausgelöst.

Das liegt daran, dass es schwierig ist, eine "so genannte" Null für den Double-Wert zu definieren.

  

PositiveInfinity ergibt sich auch aus einer Division durch Null mit einem positiven   Dividend, und NegativeInfinity ergibt sich aus einer Division durch Null mit einem   negative Dividende.   (Quelle: MSDN erneut )

DivideByZeroException ist nicht für Gleitkommatypen geeignet. Hinweis: Sie können %code% erhalten, wenn Sie versuchen, durch Null mit einem Dividend von Null zu teilen.

    
___ tag123infinity ___ Infinity ist ein spezifischer Gleitkommawert, der immer größer ist als jeder andere Gleitkommawert. Es kann als Ergebnis der Division durch Null, des arithmetischen Überlaufs und anderer außergewöhnlicher Operationen auftreten. Infinity unterscheidet sich von dem maximalen noch gültigen Gleitkommawert, den der bestimmte Datentyp halten kann. IEEE 754 Fließkomma-Standard erlaubt sowohl positive als auch negative Unendlichkeitswerte. ___ qstnhdr ___ Warum gibt diese Methode double.PositiveInfinity nicht DivideByZeroException zurück? ___ answer38576522 ___

Int in Java ist das Zweierkomplement. Ein Zweierkomplement-Integer hat keine Bits zur Verfügung, um spezielle Werte wie Infinity oder NaN zu speichern. Da das Ergebnis nicht im gewünschten Typ dargestellt werden kann, muss eine Ausnahme ausgelöst werden. Gleitkommazahlen haben dieses Problem nicht (für Infinity ist ein Bitmuster verfügbar), und daher ist keine Ausnahme erforderlich.

    
___ tag123dividebyzeroexception ___ Eine Ausnahme, die auftritt, wenn eine Berechnung versucht, eine Zahl durch Null zu teilen, was zu einem undefinierten Ergebnis führt. ___ answer38576469 ___
  

Warum hat die Methode unendlich zurückgegeben, während 3/0 einen Fehler ausgegeben hat und 3/0   b hat einen formatierten Fehler geworfen?

Da im ersten Fall die 0 keine Ganzzahl ist, ist sie doppelt. Während in der Sekunde ist eine ganze Zahl. Sie sollten hier feststellen, dass ein Double eine Gleitkommazahl ist. Es hat also keinen genauen Wert wie eine Ganzzahl. Auf der anderen Seite kann eine ganze Zahl von einem Computer mit 100% Genauigkeit dargestellt werden.

Hier können Sie einen sehr schönen Artikel über Fließkommazahlen finden.

    
___
Sergey.quixoticaxis.Ivanov 25.07.2016, 20:04
quelle
1
  

Warum hat die Methode unendlich zurückgegeben, während 3/0 einen Fehler ausgegeben hat und 3/0   b hat einen formatierten Fehler geworfen?

Da im ersten Fall die 0 keine Ganzzahl ist, ist sie doppelt. Während in der Sekunde ist eine ganze Zahl. Sie sollten hier feststellen, dass ein Double eine Gleitkommazahl ist. Es hat also keinen genauen Wert wie eine Ganzzahl. Auf der anderen Seite kann eine ganze Zahl von einem Computer mit 100% Genauigkeit dargestellt werden.

Hier können Sie einen sehr schönen Artikel über Fließkommazahlen finden.

    
Christos 25.07.2016 20:04
quelle
1

Wie bereits oben erwähnt, liegt es an Ihnen, dass Sie double als Divisor verwenden. Sie können es beweisen, indem Sie das Beispiel Ihrer Variablen verwenden, aber double anstelle von var verwenden.

%Vor%     
Rich Linnell 25.07.2016 20:08
quelle
0

Int in Java ist das Zweierkomplement. Ein Zweierkomplement-Integer hat keine Bits zur Verfügung, um spezielle Werte wie Infinity oder NaN zu speichern. Da das Ergebnis nicht im gewünschten Typ dargestellt werden kann, muss eine Ausnahme ausgelöst werden. Gleitkommazahlen haben dieses Problem nicht (für Infinity ist ein Bitmuster verfügbar), und daher ist keine Ausnahme erforderlich.

    
codemonger 25.07.2016 20:07
quelle