Возможно ли это , чтобы назначить NaN
к double
или float
в C / C ++? Как и в JavaScript вы: a = NaN
. Так что позже вы можете проверить, является ли переменная числом или нет.
Возможно ли это , чтобы назначить NaN
к double
или float
в C / C ++? Как и в JavaScript вы: a = NaN
. Так что позже вы можете проверить, является ли переменная числом или нет.
Ответы:
В C NAN
объявлен в <math.h>
.
В C ++ std::numeric_limits<double>::quiet_NaN()
объявлен в <limits>
.
Но для проверки того, является ли значение NaN, вы не можете сравнить его с другим значением NaN. Вместо этого используйте isnan()
from <math.h>
в C или std::isnan()
from <cmath>
в C ++.
x == x
возвращает, false
если и только если x
это NaN.
Как отмечали другие, вы ищете, 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)