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