Streams: Einlesen von NaN



  • Hi,

    ich hatte jetzt wieder einen blöden Fehler. Ich habe eine Reihe von floats, die ich exportiere. Die können jedoch auch NaN oder -1#IND etc. sein. Beim Einlesen kriegt der Stream das aber nicht hin und liest dann nur Unfug ein.

    Kriege ich es irgendwie hin, dass er diese Zahlen korrekt einliest?



  • Eine Möglichkeit wäre, beim Schreiben mit isnan Und isinf usw. (Erst seit C++11, aber die Implementierung ist schließlich nicht so schwer) zu prüfen und statt NaN und Inf einfach einen "Ausnahmewert" zu definieren und diesen zu schreiben, bspw. std::numeric_limits<float>::min() . Und wenn du diesen Ausnahmewert liest, das gelesene float auf NaN oder Inf zu setzen.

    Oder wie stellst du dir das vor?



  • Die Frage ist, was du mit diesen Werten machen willst, aber um eine Überprüfung/Änderung kommst du nicht drum rum. Da bietet sich neben den genannten Funktionen auch std::fpclassify() oder std::isnormal(). Was du danach mit dem Wert machst, ist dir überlassen.

    Auch: http://stackoverflow.com/questions/570669/checking-if-a-double-or-float-is-nan-in-c


  • Mod

    Hehe, das ist ja ein lustiger Quatsch im Standard, wenn man da mal nachbohrt:
    - Die Standardimplementierung der num_get-Facette verhält sich in der zweiten Stufe der Verarbeitung so wie wie strtold aus der C-Bibliothek.
    - strtold aus der C-Bibliothek kann mit "infinity", "nan" und ähnlichen Zeichenketten umgehen (ab C99-Standard)
    - Die erste Phase von num_get bricht jedoch ab, wenn die Zeichen nicht aus der Liste "0123456789abcdefxABCDEFX+-" sind. Wo "N" fehlt.
    😃



  • Na ja, ich hab gehofft, man könnte irgendein verstecktes Flag setzen oder so was... Ich habe boost::isfinite von fpclassify benutzt und schreibe stattdessen jetzt 0 in die Datei (das ist nicht unbedingt der superkorrekte Wert, im Kontext einer NaN-Zahl ist er aber absolut in Ordnung).

    Ich finde es nur inkonsequent, dass er NaN und co. brav in die Datei schreibt, beim Lesen aber nicht erkennt. Bis ich das Mal gefunden hatte...

    Habe halt eine komplexe Struktur und bearbeite jetzt halt alle mit einer Hilfsfunktion makeZeroIfNotFinite 🙄 Umständlich...



  • Ich finde es nur inkonsequent, dass er NaN und co. brav in die Datei schreibt, beim Lesen aber nicht erkennt. Bis ich das Mal gefunden hatte...

    Lol

    N3337 §5.6/4 schrieb:

    If the second operand of / or % is zero the behavior is undefined.

    Ich hoffe, dass deine Infs anders entstehen.



  • NaN ist doch ein klar definierter Wert. Ich teile nicht Mal durch 0, sondern setze einige Werte absichtlich auf quiet_nan() und Konsorten. Ist das nicht legitim?



  • Eisflamme schrieb:

    NaN ist doch ein klar definierter Wert. Ich teile nicht Mal durch 0, sondern setze einige Werte absichtlich auf quiet_nan() und Konsorten. Ist das nicht legitim?

    Nein, das ist völlig in Ordnung. Ich rede darüber, dass ich zuerst dachte, du teilst durch 0 und beschwerst dich über den Stream 😃 😃



  • Furchtbar witzig. Manche Leute laufen auch lachend in eine Kreissäge...

    Na ja, falls es sonst keine Möglichkeiten gibt (außer etwa eine eigene Facette zu schreiben o.ä.), nutze ich eben weiterhin meine Prüfung.



  • Eisflamme schrieb:

    Na ja, falls es sonst keine Möglichkeiten gibt (außer etwa eine eigene Facette zu schreiben o.ä.), nutze ich eben weiterhin meine Prüfung.

    Andere Möglichkeit: Statt deiner 0 einfach N für NaN und I für Infinite reinschreiben. Dann peekst du den Stream bevor du extrahierst und machst eine ganz normale Fallunterscheidung.

    Furchtbar witzig. Manche Leute laufen auch lachend in eine Kreissäge...

    Tut mir Leid. 😞 😞


Anmelden zum Antworten