Wie soll der gesamte Plattform-Compiler die gleiche Zeichenfolge für NaN ausgeben?

8

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).

    
jpo38 08.02.2016, 13:28
quelle

4 Antworten

5

Sie können einen Stream-Manipulator verwenden oder das zugrunde liegende Gebietsschema ändern:

Manipulator:

%Vor%

Gebietsschema:

%Vor%     
Dieter Lücking 08.02.2016, 14:28
quelle
3

Implementieren Sie einfach Ihre eigene Überprüfung gegen den Wert quiet_NaN und drucken Sie basierend darauf.

    
Marcus Müller 08.02.2016 13:31
quelle
2
  • Leiten Sie Ihre YourNumPut von std :: num_put ab.
  • Überschreibe, was du zum Beispiel brauchst: virtual iter_type do_put( iter_type out, std::ios_base& str, char_type fill, double v ) const;
  • Gebietsschema erstellen, das es verwendet: 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

  • ...
  • Gewinn;)
Öö Tiib 08.02.2016 14:26
quelle
0

Verwenden Sie isnan (), um portabel zu testen, ob double ein NaN ist.

%Vor%     
Sam Varshavchik 08.02.2016 13:34
quelle

Tags und Links