Rozważmy następujący fragment kodu:Jak uzyskać wszystkie wyniki kompilatora platformy dla tego samego ciągu dla NaN?
#include <iostream>
#include <string>
#include <limits>
int main()
{
std::cout << std::numeric_limits<double>::quiet_NaN();
}
Kiedy skompilowany z Visual Studio 2010, wyjście jest 1.#QNAN
. Gdy skompilowane z g ++, wyjście to nan
. Zwróć uwagę, że Visual Studio 2015 wyświetla "nan".
Potrzebuję jednak obu tych samych wyników. Jaki jest najprostszy sposób to zrobić? Próbowałem zastąpić operator<<
dla double
, ale wydaje mi się, że nie jest to właściwy sposób. Czy ciąg może być użyty dla wartości NaN
wartość być wymuszona na poziomie stream
, lub lepiej, na poziomie globalnym (używając std::locale
rzeczy? ... nigdy nie używane, że ...).
Znalazłem ten przykład squaring_num_put. Interesujące, ponieważ jest to sposób modyfikowania liczby, jest przekierowywany na wyjście. Ale ciężko mi próbować dostosować go do mojego problemu (nie można ustawić, aby do_put
wysyłał albo numer, albo zakodowany ciąg "NaN" do ostream
...).
* Muszę zarówno do wytworzenia tej samej wyjście *. Brzmi jak problem XY do mnie ... –
Wypisywanie liczb ostatecznie wywołuje ['std :: num_put :: do_put'] (http://en.cppreference.com/w/cpp/locale/num_put/put), które zasadniczo używa ['std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf) do formatowania danych wyjściowych. I jak mówi się na stronach ['std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf), wyjściem dla NaN powinno być' nan' lub 'nan (char_sequence) '. (która to implementacja jest zdefiniowana) Oznacza to, że Visual Studio jest źle. Oznacza to również, że nawet dla zgodnych kompilatorów i bibliotek masz dwa alternatywne wyjścia do obsługi –
. Zatem może być pytanie, jak zmusić VS2010 do wyprowadzenia "nan" zamiast "1. # QNAN" .... nie, że VS2015 podąża za standard i wyjścia "nan", co jest w porządku. – jpo38