Рассмотрим следующий фрагмент кода:Как заставить весь компилятор платформы выводить ту же строку для NaN?
#include <iostream>
#include <string>
#include <limits>
int main()
{
std::cout << std::numeric_limits<double>::quiet_NaN();
}
При компиляции с Visual Studio 2010, выход 1.#QNAN
. При компиляции с g ++ вывод равен nan
. Обратите внимание, что Visual Studio 2015 выводит «nan».
Однако мне нужно, чтобы оба продукта производили одинаковый выход. Какой самый простой способ сделать это? Я попытался переопределить operator<<
для double
, но я чувствую, что это неправильный способ сделать. Может ли строка, которая будет использоваться для значения NaN
, должна быть принудительно установлена на уровне stream
или, лучше, на глобальном уровне (используя std::locale
?? ... никогда не использовал это ...).
Я нашел этот пример squaring_num_put. Интересно, потому что это способ изменить число, перенаправляется на выход. Но мне сложно с этим приспособиться к моей проблеме (не удалось сделать do_put
отправкой либо номер, либо стробированную строку «NaN» на ostream
...).
* Мне нужно как производить тот же результат *. Звучит как проблема XY для меня ... –
Вывод чисел в конечном итоге вызывает ['std :: num_put :: do_put'] (http://en.cppreference.com/w/cpp/locale/num_put/put), который в основном использует ['std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf) для форматирования вывода. И, как говорится в справочных страницах ['std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf), выход для NaN должен быть' nan' или 'nan (char_sequence) '. (какой из них реализован) Это означает, что Visual Studio ошибочно. Это также означает, что даже для совместимых компиляторов и библиотек у вас есть два альтернативных вывода для обработки –
. Вопрос может заключаться в том, как заставить VS2010 выводить «нан», а не «1. # QNAN» .... нота, что VS2015 следует стандарт и выходы «nan», что в порядке. – jpo38