Betrachten Sie dieses Code-Snippet:
%Vor% Bei der Kompilierung mit Visual Studio 2010 lautet die Ausgabe 1.#QNAN
. Wenn sie mit g ++ kompiliert wird, lautet die Ausgabe nan
. Beachten Sie, dass Visual Studio 2015 "nan" ausgibt.
Allerdings muss ich beide die gleiche Ausgabe produzieren. Was ist der einfachste Weg, das zu tun? Ich habe versucht, operator<<
für double
zu überschreiben, aber ich habe das Gefühl, dass das nicht der richtige Weg ist. Kann String, der für NaN
verwendet werden soll, auf stream
level oder besser auf globaler Ebene erzwungen werden (mit std::locale
stuff? ... nie benutzt ...).
Ich habe das quadring_num_put Beispiel gefunden. Interessant, weil es eine Möglichkeit ist, eine Nummer zu ändern, die zur Ausgabe umgeleitet wird. Aber es fällt mir schwer, es an mein Problem anzupassen ( do_put
konnte weder eine Zahl noch eine fest codierte "NaN" -Zeichenfolge an ostream
senden).
Sie können einen Stream-Manipulator verwenden oder das zugrunde liegende Gebietsschema ändern:
Manipulator:
%Vor%Gebietsschema:
%Vor% Implementieren Sie einfach Ihre eigene Überprüfung gegen den Wert quiet_NaN
und drucken Sie basierend darauf.
YourNumPut
von std :: num_put ab. virtual iter_type do_put( iter_type out, std::ios_base& str, char_type fill, double v ) const;
std::locale yourLocale(std::locale(), new YourNumPut());
Setze es global, imbue cout
und cerr
oder wo du brauchst: std::locale::global(yourLocale); std::cout.imbue(yourLocale); std::cerr.imbue(yourLocale);
Testen Sie es
Verwenden Sie isnan
(), um portabel zu testen, ob double
ein NaN ist.