std:: числовые ограничения:: тихий NaN () против std:: nan () против NAN

Я был удивлен количеством объектов C++, представляющих тихое значение NaN. Я нашел три стандартных способа:--9-->

  1. std::numeric_limits<T>::quiet_NaN() - общая, и я думал, что это был избранный
  2. std::nan, std::nanf, std::nanl - семейство функций, принимая const char* аргумент
  3. NAN - макрос, "который оценивает тихое не-число"

каждого из них были введены в C++11. У меня есть несколько вопросов относительно этого:

  1. что значит const char* аргумент стоять в std::nan и co? Как он используется?
  2. Какого черта нам нужно добавить макрос в C++11, в то время как мы уже добавили общий класс признаков для этой цели? (Это для совместимости с C?)
  3. что я должен использовать по умолчанию? (Я полагаю, это первый)

1 ответов


std::nan, std::nanl и std::nanf наследуются от библиотеки C Math и NAN macro. Они все живут в C <math.h>. Однако, как предполагает @NicolBolas, они были введены только в C++11, потому что они не были частью ANSI C, а скорее C99, более новой версии стандарта языка C. Комитет по стандартам c++ прилагал усилия для "обновления" совместимости C, так сказать.

std::numeric_limits<T> был предназначен для самого C++ (задолго до C++11), и это то, что я бы использовал.

Итак, ответ в нижней строке: совместимость C99.