140

这可以将 a 分配NaN给 adoublefloatC/C++ 吗?就像在 JavaScript 中一样:a = NaN. 所以稍后您可以检查变量是否为数字。

4

5 回答 5

182

在 C 中,NAN<math.h>.

在 C++ 中,std::numeric_limits<double>::quiet_NaN()<limits>.

但是为了检查一个值是否为 NaN,你不能将它与另一个 NaN 值进行比较。而是使用C 中的isnan()from<math.h>或C++ 中的std::isnan()from 。<cmath>

于 2013-05-22T12:07:41.937 回答
28

正如其他人指出的那样,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。

here所述,这true意味着您的平台支持IEEE 754标准。This previous thread解释了这在大多数情况下应该是正确的。

于 2013-05-22T12:28:56.953 回答
9

这可以使用 C++ 中的 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.
于 2013-05-22T12:05:32.703 回答
4

这是否可以将 NaN 分配给 C 中的 double 或 float ...?

是的,从 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)

...检查变量是否为数字。

使用isnan(), std::isnan()<math.h>, <cmath>.

于 2020-05-19T23:13:52.083 回答
-9

是的,通过指针的概念,您可以对 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 中对我有用。

于 2020-09-28T12:33:04.763 回答