Was bedeuten 1.#INF00, -1.#IND00 und -1.#IND?

Lesezeit: 5 Minuten

Was bedeuten 1INF00 1IND00 und 1IND
Hoffmann

Ich spiele mit etwas C-Code herum, der Floats verwendet, und ich erhalte 1.#INF00, -1.#IND00 und -1.#IND, wenn ich versuche, Floats auf dem Bildschirm zu drucken. Was bedeuten diese Werte?

Ich glaube, dass 1.#INF00 positiv unendlich bedeutet, aber was ist mit -1.#IND00 und -1.#IND? Ich habe auch manchmal diesen Wert gesehen: 1.$NaN, was keine Zahl ist, aber was verursacht diese seltsamen Werte und wie können sie mir beim Debuggen helfen?

Ich benutze MinGW was ich glaube verwendet IEEE754 Darstellung für Fließkommazahlen.

Kann jemand all diese ungültigen Werte auflisten und was sie bedeuten?

  • Auf diese Weise formatiert die Microsoft C-Laufzeitbibliothek Infinity- und NaN-Gleitkommawerte. MinGW hat keine eigene CRT, es verwendet die vom Betriebssystem bereitgestellte msvcrt.dll. Wie es genau aussieht, hängt von dem von Ihnen verwendeten printf()-Formatbezeichner ab, also können die zusätzlichen Nullen sogar zu 1.#J werden. Der C99-Standard legt die erwartete Ausgabe fest, die in VS2015 übernommen wurde, sodass diese Eigenart verschwinden wird.

    – Hans Passant

    16. August 2018 um 7:04 Uhr

Was bedeuten 1INF00 1IND00 und 1IND
Matte

Von IEEE-Gleitkommaausnahmen in C++ :

Auf dieser Seite werden die folgenden Fragen beantwortet.

  • Mein Programm hat gerade 1.#IND oder 1.#INF (unter Windows) oder nan oder inf (unter Linux) ausgegeben. Was ist passiert?
  • Wie kann ich feststellen, ob eine Zahl wirklich eine Zahl ist und nicht eine NaN oder eine Unendlichkeit?
  • Wie kann ich zur Laufzeit mehr Details über Arten von NaNs und Unendlichkeiten erfahren?
  • Haben Sie einen Beispielcode, um zu zeigen, wie das funktioniert?
  • Wo kann ich mehr erfahren?

Diese Fragen haben mit Gleitkommaausnahmen zu tun. Wenn Sie eine seltsame nicht-numerische Ausgabe erhalten, bei der Sie eine Zahl erwarten, haben Sie entweder die endlichen Grenzen der Gleitkommaarithmetik überschritten oder Sie haben nach einem undefinierten Ergebnis gefragt. Der Einfachheit halber bleibe ich bei der Arbeit mit dem doppelten Fließkommatyp. Ähnliche Bemerkungen gelten für Float-Typen.

Debuggen von 1.#IND, 1.#INF, nan und inf

Wenn Ihre Operation eine größere positive Zahl erzeugen würde, als in einem Double gespeichert werden könnte, gibt die Operation 1.#INF unter Windows oder inf unter Linux zurück. In ähnlicher Weise gibt Ihr Code -1.#INF oder -inf zurück, wenn das Ergebnis eine negative Zahl wäre, die zu groß wäre, um sie in einem Double zu speichern. Die Division einer positiven Zahl durch Null ergibt eine positive Unendlichkeit und die Division einer negativen Zahl durch Null ergibt eine negative Unendlichkeit. Der Beispielcode am Ende dieser Seite zeigt einige Operationen, die Unendlichkeiten erzeugen.

Einige Operationen sind mathematisch nicht sinnvoll, wie z. B. das Ziehen der Quadratwurzel aus einer negativen Zahl. (Ja, diese Operation ist im Zusammenhang mit komplexen Zahlen sinnvoll, aber ein Double stellt eine reelle Zahl dar, und daher gibt es kein Double, um das Ergebnis darzustellen.) Dasselbe gilt für Logarithmen negativer Zahlen. Sowohl sqrt(-1.0) als auch log(-1.0) würden ein NaN zurückgeben, den Oberbegriff für eine „Zahl“, die „keine Zahl“ ist. Windows zeigt eine NaN als -1.#IND (“IND” für “unbestimmt”) an, während Linux nan anzeigt. Andere Operationen, die eine NaN zurückgeben würden, sind 0/0, 0*∞ und ∞/∞. Beispiele finden Sie im folgenden Beispielcode.

Kurz gesagt, wenn Sie 1.#INF oder inf erhalten, suchen Sie nach Überlauf oder Division durch Null. Wenn Sie 1.#IND oder nan erhalten, suchen Sie nach illegalen Operationen. Vielleicht hast du einfach einen Bug. Wenn es subtiler ist und Sie etwas haben, das schwer zu berechnen ist, lesen Sie Vermeidung von Überlauf, Unterlauf und Genauigkeitsverlust. Dieser Artikel gibt Tricks zum Berechnen von Ergebnissen, bei denen Zwischenschritte überlaufen, wenn sie direkt berechnet werden.

  • Ich weiß, dass das OP nicht wirklich danach gefragt hat, aber als praktischen Test, myfloat == myfloat gibt false zurück, wenn Sie einen dieser magischen Werte haben.

    – Tenpn

    13. Januar 2012 um 10:24 Uhr

  • @tenpn Eigentlich in C++, +infinity==+infinity. Versuchen Sie, 1.0 / 0.0 zu überprüfen: 1.#INF00 == 1.#INF00 gibt wahr zurück, -1.#INF00 == -1.#INF00 gibt true zurück, aber 1.#INF00 == -1.#INF00 ist falsch.

    – bobobobo

    21. Februar 2012 um 17:15 Uhr


  • Bei anderen Konfigurationen bin ich mir nicht sicher, aber unter Windows 7 / Visual Studio 2010. float nan = sqrtf(-1.0f); nan == nan; // wird als wahr ausgewertet … im Gegensatz zu dem, was tenpn sagte … (Kommentar von Yevgen V)

    – Jeff

    10. August 2012 um 0:04 Uhr


  • Wenn Sie C++11 verwenden können, schauen Sie sich an std::isfinite() und dergleichen. Wenn Sie Boost verwenden können, sind Sie auch Glück

    – Brandlingo

    11. September 2014 um 14:39 Uhr


  • @ Jeff, das hängt wahrscheinlich mit der Optimierung zusammen. Sehen die entsprechende Dokumentseite.

    – Ruslan

    16. August 2018 um 5:46 Uhr

1646647211 599 Was bedeuten 1INF00 1IND00 und 1IND
Benutzer2426679

Für alle, die sich über den Unterschied zwischen wundern -1.#IND00 und -1.#IND (was die Frage speziell gestellt hat und keine der Antworten anspricht):

-1.#IND00

Dies bedeutet insbesondere eine Zahl ungleich Null dividiert durch Null, z 3.14 / 0 (Quelle)

-1.#IND (ein Synonym für NaN)

Dies bedeutet eines von vier Dingen (vgl wiki aus Quelle):

1) sqrt oder log einer negativen Zahl

2) Operationen, bei denen beide Variablen 0 oder unendlich sind, z 0 / 0

3) Operationen, bei denen mindestens eine Variable bereits vorhanden ist NaNz.B NaN * 5

4) Trigger außerhalb des Bereichs, z arcsin(2)

Ihre Frage “was sind sie” wurde oben bereits beantwortet.

Zum Debuggen (Ihre zweite Frage) und zum Entwickeln von Bibliotheken, in denen Sie nach speziellen Eingabewerten suchen möchten, finden Sie möglicherweise die folgenden Funktionen in Windows C++ nützlich:

_isnan(), _isfinite() und _fpclass()

Unter Linux/Unix sollten Sie isnan(), isfinite(), isnormal(), isinf(), fpclassify() nützlich finden (und Sie müssen möglicherweise mit libm verknüpfen, indem Sie das Compiler-Flag -lm verwenden).

1646647212 189 Was bedeuten 1INF00 1IND00 und 1IND
Jeff

Für diejenigen unter Ihnen in einer .NET-Umgebung kann das Folgende eine praktische Möglichkeit sein, Nicht-Zahlen herauszufiltern (dieses Beispiel ist in VB.NET, aber es ist wahrscheinlich in C# ähnlich):

If Double.IsNaN(MyVariableName) Then
    MyVariableName = 0 ' Or whatever you want to do here to "correct" the situation
End If

Wenn Sie versuchen, eine Variable mit einem NaN-Wert zu verwenden, erhalten Sie die folgende Fehlermeldung:

Der Wert war entweder zu groß oder zu klein für eine Dezimalzahl.

965010cookie-checkWas bedeuten 1.#INF00, -1.#IND00 und -1.#IND?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy