C/C + + NaN 常数(字面值) ? ?

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

135144 次浏览

这可以通过使用 C + + 中的 numeric _ limit 来实现:

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.

在 C 中,NAN<math.h>中声明。

在 C + + 中,std::numeric_limits<double>::quiet_NaN()<limits>中声明。

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

正如其他人指出,你正在寻找的 std::numeric_limits<double>::quiet_NaN(),虽然我不得不说,我更喜欢的 Cppreference.com文件。特别是因为这句话有点含糊:

只有当 std: : numeric _ limit: : has _ static _ NaN = = true 时才有意义。

在这个网站上很容易知道这意味着什么,如果你查看他们在 std::numeric_limits::has_quiet_NaN上的章节,就会发现:

此常量对于所有浮点类型都有意义,并且在 std: : numeric _ limit: : is _ iec559 = = true 时保证为 true。

这解释了 给你如果 true意味着你的平台支持 IEEE 754标准。这个 上一个帖子解释说,这应该是真正的大多数情况下。

这是否可能指定一个 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)

检查变量是否是数字。

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

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