Probleme bei Auswertung von einfachen Ausdrücken

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Probleme bei Auswertung von einfachen Ausdrücken

    Hallo Ihr Spezialisten,
    ich habe ein relativ umfangreiches Programm mit recht viel Mathematik geschrieben. Das bringt zu meiner Überraschung in einem Fall von vielen, die einwandfrei laufen, da wo im Ergebnis eine Double-Zahl erwartet wird, die Ausgabe -1.#IND . Ich habe keine Ahnung, was das bedeutet, habe auch bisher nichts dazu gefunden.

    Ich habe versucht, dem Problem auf den Grund zu gehen. Das scheint im Zusammenhang zu stehen mit Zwischenwerten die statt mit einer Double-Zahl mit NaN angegeben werden. Ich habe versucht, herauszufinden, wann das zum ersten Mal geschieht, indem ich Ausgabefiles durchgesucht habe und festgestellt, dass es ungefähr an einer Stelle passiert, die durch einen Arrayindex 1212 gekennzeichnet ist.

    Ich habe dann mit einer Msgbox den Verlauf des Problems verfolgt. Hier ein kleiner Codeausschnitt:

    For n = 0 To npmax
    i_punkt = punkt(n, 0) - punkt(0, 0)
    j_punkt = punkt(n, 1) - punkt(0, 1)
    abst(n) = ipe * j_punkt - jpe * i_punkt
    If ilp + n = 1208 Then Stop
    MsgBox(CStr(ilp + n) & " " & Format(abst(n), "0.000"))
    Next

    Die Msgbox ist auskommentiert bis die Stopanweisung eintritt. Dann wird das Kommentar-Apostroph entfernt und die Msgbox zeigt die Werte an. Alle ...punkt-Variablen sind Doublewerte im Bereich von -100 bis +100. Entsprechend auch abst, dessen Wert in der Msgbox ausgegeben wird. Und da werden für die Indizes (ilp + n) von 1209 bis 1216 ganz vernünftige Werte ausgegeben. Bei Index 1217 kommt als Wert 0.000, was richtig ist, wie man aus der Zeile für die Zuweisung von abst errechnen kann. Doch wenn man die Msgbox mit OK beantwortet, kommt der Index 1217 noch einmal in der Msgbox, wird also nicht weitergezählt. Und dann erscheint für abst der Ausgabewert NaN.

    Kann mir das jemand erklären, wieso die gleiche Programmzeile zweimal unmittelbar nacheinander aufgerufen wird? Denn die Schleife ist ja nicht gelaufen, sonst wäre der nächst höhere Index angezeigt worden. Und was bedeutet es, wenn die Msgbox zuerst einen vernünftigen Wert, dann aber gleich noch einmal als Wert NaN ausgibt?

    Ich hatte zuerst einen Hardwarefehler vermutet, aber auf einem anderen Rechner läuft es genauso.

    Für mich ist das ganze rätselhaft, aber vielleicht kennt das ja jemand.

    artnat schrieb:

    -1.#IND . Ich habe keine Ahnung, was das bedeutet, habe auch bisher nichts dazu gefunden.
    Bei folgende Operationen, kommt es zu einem solchen Ergebnis:
    1 / 0 => Double.PositiveInfinity
    -1 / 0 => Double.NegativeInfinity
    0 / 0 => Double.NaN
    Diese "Werte" liefern dann solch String-Repräsentationen.
    Gugst Du docs.microsoft.com/de-de/dotne…m.double.nan?view=net-5.0 und die folgenden Seiten.
    Diese Zustände kannst Du abfragen und entsprechend darauf reagieren.
    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!
    Hallo, Franky, vielen Dank für Deinen Link. Ich habe den trotz vielem Suchen nicht gefunden.
    Der Link hat mir erst einmal erklärt, was die kryptischen Angaben bedeuten. Eine Abrage nach NaN hat nicht geklappt, aber ich bin dadurch auf einen Sonderfall in den zu verarbeitenden Daten aufmerksam geworden, und den habe ich vorher zu einer Sonderbehandlung abgezweigt, dann tritt das Problem nicht mehr auf. Mein Fall ist also gelöst.
    Was nicht erklärt ist: Wieso meldet sich eine Msgbox unmittelbar nacheinander zweimal? Erst mit null, dann mit NaN. Weil ja der Index mit in der Box war, war es sicher, dass hier die gleiche Programmzeile zweimal ausgeführt wurde, wie als ob dass Programm sagen wollte: "Oooops, habe mich geirrt, es muss NaN heißen."

    artnat schrieb:

    Eine Abrage nach NaN hat nicht geklappt
    So was:
    docs.microsoft.com/de-de/dotne…double.isnan?view=net-5.0
    und: Lerne zu debuggen:
    Debuggen, Fehler finden und beseitigen
    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!