Division durch Null

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Division durch Null

    Moin moin

    Irgendwie verstehe ich die Welt nicht mehr..
    Bei jedem Taschenrechner, Handy usw kommt der Fehler " Teilen durch Null nicht möglich " :!:

    Jetzt war ich dabei einen neuen Logger für meine Programme zu schreiben und zu testen...
    Als ich dann Stunden damit verbrachte einen Fehler zu finden ( den es wohl garnicht gibt ), warum der Logger nicht reagiert, machte ich ein völlig neues Projekt auf.
    Nur diesen Code rein und .... ?( ?(

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. test()
    4. End Sub
    5. Private Sub test()
    6. Dim x As Double = 1
    7. Dim y As Double = 0
    8. Dim result As Double = x / y
    9. Debug.WriteLine($"Ergebnis: {result}")
    10. End Sub
    11. End Class


    Debug Ausgabe:
    Ergebnis: +unendlich

    Hier kommt kein Fehler, kein Absturz . :?:
    Das ist doch nicht logisch? :/
    Wo fliegen denn da meine Neuronen falsch??
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Erstmal gilt Mathematik und Codeimplementierungen müssen nicht immer konform gehen.
    Außerdem ist die Assoziation 1/0 = unendlich auch nicht weit hergeholt. (und nicht generell mathematisch falsch)
    Probier mal x = 0, y = 0; da wird ein "nicht definiert" zurückgegeben, so wie du willst. Das ist übrigens auch ein Doublewert und kein Fehler.
    @Amelie Dieser NET-Formalismus sichert Dir, dass Dir eine solche Operation keine Exception liefert.
    Wenn Du eine Exception haben möchtest, musst Du die Werte testen und das richtige tun:

    VB.NET-Quellcode

    1. If Double.IsNaN(wert) Then ...
    2. If Double.IsInfinity(wert) Then ...
    3. If Double.IsNegativeInfinity(wert) Then ...
    4. If Double.IsPositiveInfinity(wert) Then ...
    Man kann auch ganz locker mit solchen Werten arbeiten, nicht aber rechnen, da sämtliche weitere Operationen mit so einem Wert wieder einen Nicht-Double-Wert liefern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich habe es mal gerade mit .net 8 probiert und bisher muss ich sagen, dass mich Roslyn immer wieder positiv begeistert.

    Wenn ich stumpf durch 0 teile, dann kommt folgendes:

    Quellcode

    1. ​simon@ODIN: /home/simon/source/vb_paradise git:(master) ✗
    2. ➜ dotnet build
    3. MSBuild version 17.8.3+195e7f5a3 for .NET
    4. Determining projects to restore...
    5. Restored /home/simon/source/vb_paradise/vb_paradise.csproj (in 522 ms).
    6. /home/simon/source/vb_paradise/Program.cs(8,52): error CS0020: Division by constant zero [/home/simon/source/vb_paradise/vb_paradise.csproj]
    7. Build FAILED.
    8. /home/simon/source/vb_paradise/Program.cs(8,52): error CS0020: Division by constant zero [/home/simon/source/vb_paradise/vb_paradise.csproj]
    9. 0 Warning(s)
    10. 1 Error(s)
    11. Time Elapsed 00:00:02.25


    Ändere ich den Code nun ab, dass eine Variable (möglicherweise) den Wert null enthält:

    C#-Quellcode

    1. ​using System;
    2. namespace VbParadise {
    3. static class Program {
    4. public static void Main(string[] args) {
    5. int divisor = args.Length;
    6. Console.WriteLine($"Dividing by zero: {100/divisor}");
    7. }
    8. }
    9. }


    und das ganze ausführe:

    Quellcode

    1. simon@ODIN: /home/simon/source/vb_paradise git:(master) ✗
    2. ➜ ./bin/Debug/net8.0/vb_paradise
    3. Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.
    4. at VbParadise.Program.Main(String[] args) in /home/simon/source/vb_paradise/Program.cs:line 9
    5. [1] 340 IOT instruction ./bin/Debug/net8.0/vb_paradise​


    Dann hat das Programm das gewünschte Verhalten und wirft eine Exception. Das könnte sich hier also um eine VB-Eigenart handeln.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    In .NET Framework kommt bei mir erstmal gar keine Exception. Das gleiche Bild in .NET 7
    Bilder
    • NetFx.png

      30,09 kB, 729×504, 36 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo und danke erstaml für die ganzen Antworten.

    Das mit den Gleitkommazahlen und NaN usw.. habe ich ja alles gelesen. Ja und in der Schule lernte ich auch mal, das ich eine Zahl nicht durch Null teilen kann. Da war keine Rede von "+unendlich".
    Selbst mein Handy sagt, "Berechnung nicht möglich!"

    Ich finde es nur so seltsam, das alles Mögliche in diesem .Net Zeug mit Exceptions unterbrochen wird nur eben so etwas nicht??
    Ich dachte ja das soetwas:

    VB.NET-Quellcode

    1. Public Sub New()
    2. ' Fehlerbehandlung für den Anwendungs-Thread und die App-Domäne einrichten
    3. AddHandler Application.ThreadException, AddressOf ExceptionHandlerForErrors
    4. AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ExceptionHandlerForErrors


    würde solche unerwarteten Fehler, ( welche wohl gar keine sind ) abfangen.


    Nun nach vielem lesen, und fragen, sagte mir ein Freund, folgendes.

    In .net wird viel darauf gelegt, das Programme nicht mehr so abstürzen wie früher. Es gibt verschiedene Möglichkeiten, um das Handling von Ausnahmen in .Net zu behandeln. Eine klassische Vorgehensweise sind " Try Catch Finaly ". Im günstigsten Falle bekommt man eine Nachricht mit der der EndUser dann etwas anfangen kann oder auch nicht. Aber das Programm stürzt eben nicht ab.

    Na toll. Das würde ja alles über Bord werfen was ich bis jetzt gelernt habe, wenn dem so ist :?: ?(


    Also muss ich nun für alles irgendwelche abfragen schreiben und "alles vorhersehen", was evtl passieren kann? "Unerwartete Fehler" :?:
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    ErfinderDesRades schrieb:

    komisch nur, dasses eine Exception dafür durchaus gibt


    Eigentlich nicht. Die gibt es halt für Ganzzahlen int/long. Nur float/double darf durch 0 teilen. Und der Kompiler ist so schlau, dass er das sieht und bei @VaporiZed aus den Int direkt double gemacht hat. Sieht man daran, dass Int kein Nan hat. Schreib mal As Integer da dran.
    Ja, bei Integerdivision kommt auch DivideByZeroException: es wurde versucht, durch 0 (null) zu teilen. Bei CInt(IntX / 0) kommt eine StackOverflowException
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.