2017-02-04 20 views
3

Я был удивлен количеством объектов на C++ для представления тихого значения NaN. Я нашел три стандартный способ:std :: numeric_limits :: quiet_NaN() vs. std :: nan() vs. NAN

  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 и сотрудничестве? Как он используется?
  2. Почему, черт возьми, нам нужно добавить макрос в C++ 11, хотя мы уже добавили для этого общий класс признаков? (Является ли он совместимым с C?)
  3. Какой именно я должен использовать по умолчанию? (Я полагаю, что это первый)
+1

Символ используется для указания того, что Нан вы хотите. Интерпретация неуточненна (iirc), но в моем ящике linux байты используются для инициализации «полезной нагрузки» Nan, предназначенной в первую очередь для диагностики того, откуда происходят определенные Nans. –

ответ

4

std::nan, std::nanl и std::nanfare inherited from the C Math library; так и NAN macro. Все они живут в C's <math.h>. Однако, как сообщают @NicolBolas, они были введены только в C++ 11, потому что они не были частью ANSI C, а скорее C99, более новой версии стандарта языка C. Комитет стандартов C++ прилагал усилия, чтобы «обновить» совместимость C, так сказать.

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

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

+3

Вы должны, вероятно, отметить, что те функции C были добавлены в C99 и, похоже, были добавлены в C++ 11 из-за включения стандартной библиотеки C99. –

+0

@NicolBolas: Спасибо, это имеет смысл. – einpoklum

Смежные вопросы