Константа C/С++ NaN (буквальная)?

Можно ли назначить NaN для double или float в C/С++? Как и в JavaScript, вы делаете: a = NaN. Поэтому позже вы можете проверить, является ли переменная числом или нет.

Ответ 1

В C, NAN объявляется в <math.h>.

В С++ std::numeric_limits<double>::quiet_NaN() объявлен в <limits>.

Но для проверки того, является ли значение NaN, вы не можете сравнить его с другим значением NaN. Вместо этого используйте isnan() из <math.h> в C или std::isnan() из <cmath> в С++.

Ответ 2

Как указывали другие, вы ищете std::numeric_limits<double>::quiet_NaN(), хотя я должен сказать, что предпочитаю cppreference.com документы. Тем более, что это утверждение немного расплывчато:

Только значение, если std:: numeric_limits:: has_quiet_NaN == true.

и было легко понять, что это означает на этом сайте, если вы проверите их раздел на std::numeric_limits::has_quiet_NaN, он говорит:

Эта константа имеет смысл для всех типов с плавающей точкой и гарантируется, что она истинна, если std:: numeric_limits:: is_iec559 == true.

который, как описано здесь, если true означает, что ваша платформа поддерживает стандарт IEEE 754. Этот предыдущий поток объясняет, что это должно быть правдой для большинства ситуаций.

Ответ 3

Это можно сделать с помощью numeric_limits в С++:

http://www.cplusplus.com/reference/limits/numeric_limits/

Вот те методы, которые вы, вероятно, хотите посмотреть:

infinity()  T   Representation of positive infinity, if available.
quiet_NaN() T   Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T   Representation of signaling "Not-a-Number", if available.

Ответ 4

Как правило, неплохо иметь недопустимые числа в вашей программе. Это может быть очень сложно избавиться от них позже, и они могут привести к сбою вашей программы.

Вот хороший список способов уловить такие числа, не назначая их им: https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing-errors

Короче говоря, их три:

  • Сравнение
  • с использованием стандарта С++ 11
  • с использованием управляющих слов _controlfp и _control87