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

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

4 ответа

Решение

В С, NAN объявлен в <math.h>,

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

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

Как уже отмечали другие, вы ищете 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 стандарт. Этот предыдущий поток объясняет, что это должно быть верно для большинства ситуаций.

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

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.

Можно ли присвоить NaN двойному или плавающему в C ...?

Да, начиная с C99, (C++11) <math.h> предлагает следующие функции:

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

которые похожи на их strtod("NAN(n-char-sequence)",0) аналоги и NAN для заданий.

// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);

Пример вывода: (зависит от реализации)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)

Да , по концепции указателя вы можете сделать это так для переменной int:

int *a;
int b=0;
a=NULL; // or a=&b; for giving the value of b to a
if(a==NULL) 
  printf("NULL");
else
  printf(*a);

это очень просто и понятно. у меня это сработало в Arduino IDE.

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

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

Короче, их три:

  • сравнение
  • используя стандарт C++11
  • используя контрольные слова _controlfp и _control87
Другие вопросы по тегам