Возможно ли присвоить NaN
double
или float
в C/C++? Как и в JavaScript, вы делаете: a = NaN
. Поэтому позже вы можете проверить, является ли переменная числом или нет.
Константа C/C++ NaN (буквальная)?
Ответы (5)
В C NAN
объявляется в <math.h>
.
В C++ std::numeric_limits<double>::quiet_NaN()
объявляется в <limits>
.
Но для проверки того, является ли значение NaN, вы не можете сравнить его с другим значением NaN. Вместо этого используйте isnan()
из <math.h>
в C или std::isnan()
из <cmath>
в C++.
x == x
возвращает false
тогда и только тогда, когда x
равно NaN.
- person Archie; 22.05.2013
(x == x) == false
гарантируется в Java, см. grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/
- person Oliv; 06.07.2016
std::numeric_limits<double>::quiet_NaN()
не является константой в MSVC++2013.
- person Serge Rogatch; 03.09.2016
std::isnan(a)
значение true, если a
равно -nan
?
- person Simon C.; 16.07.2017
std::numeric_limits
? Есть ли другой способ получить NaN
, например константу, определяемую делением нуля на ноль, или это плохая идея?
- person Aaron Franke; 07.11.2019
Как уже отмечали другие, вы ищете std::numeric_limits<double>::quiet_NaN()
, хотя я должен сказать, что предпочитаю cppreference .com документы. Тем более, что это утверждение немного расплывчато:
Имеет смысл, только если std::numeric_limits::has_quiet_NaN == true.
и было просто понять, что это означает на этом сайте, если вы посмотрите их раздел на std::numeric_limits::has_quiet_NaN
там написано:
Эта константа имеет смысл для всех типов с плавающей запятой и гарантированно имеет значение true, если 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)
x = NAN;
удовлетворяет большинство потребностей, иначе x = nan("0x12345");
— это простой способ указать полезную нагрузку. Различия в содержимом полезной нагрузки определяются реализацией. Обычно MSBit 52-битной полезной нагрузки представляет собой тихий / сигнальный флаг. См. NAN.
- person chux - Reinstate Monica; 24.09.2020
да, по концепции указателя вы можете сделать это для переменной 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.
NULL
и NaN
на самом деле не одно и то же
- person Benjamin Zach; 28.09.2020