Можно ли предположить, что плавающие или двойные NaN всегда будут «nan» в виде строки? - PullRequest
2 голосов
/ 18 июня 2019

Если я печатаю NaN с помощью std :: cout или преобразую его в строку, говорит ли стандарт, что он должен быть "nan" как строка?

Существуют ли другие методы для преобразования NaN в строку, где это не так?

#include <iostream>
#include <limits>

int main() {    

    float x = std::numeric_limits<float>::quiet_NaN();
    std::cout << x << '\n';                 // Output: nan
    std::cout << std::to_string(x) << '\n'; // Output: nan
    printf("%f", x);                        // Output: nan

    // possibly other variants to print x
}

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

std :: to_string определяется в терминах std :: sprintf , который C ++ принимает из стандартной библиотеки C99.И там написано:

Не-число преобразуется в nan или nan(char_sequence).Какой из них используется, определяется реализацией.

Таким образом, строка будет начинаться с nan, но после нее могут быть другие символы.

К сожалению, библиотека Microsoft не кажетсябыть послушным.Смотрите этот ответ:

https://stackoverflow.com/a/7478290/856199

Итак, после всего этого, в конечном итоге ваша стандартная библиотека C не совместима с C99, начиная с 1. # QNANне является допустимым выводом fprintf в соответствии с вышеизложенным.Но хорошо известно, что среда выполнения Microsoft C не совместима с C99, и, насколько я знаю, она не планирует в ближайшее время стать совместимой.


(не по теме)
Не используйте std::endl, если только вам не нужна короткая форма '\n' << std::flush.

1 голос
/ 18 июня 2019

Добавление к @Nikos C.:

std :: cout, который является std :: basic_ostream , приводит к std :: num_put о форматировании, которое говорит

Если тип v является типом с плавающей запятой, выбирается первый из следующих возможных вариантов:

If floatfield == std::ios_base::fixed, will use conversion specifier %f 
If floatfield == std::ios_base::scientific && !uppercase, will use conversion specifier %e 
If floatfield == std::ios_base::scientific, will use conversion specifier %E

Итак, я собираюсь заключить, что стандарт:: cout также привязан к printf

...