C/C++NaN常量(文字)

C/C++ NaN constant (literal)?

本文关键字:文字 常量 C++NaN      更新时间:2023-10-16

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

在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_limits:has_quiet_NaN==true时才有意义。

如果你查看他们在std::numeric_limits::has_quiet_NaN上的部分,就会很容易弄清楚这在这个网站上意味着什么:

此常数对所有浮点类型都有意义,并且如果std::numeric_limits:is_iec559==true,则保证为true。

如果CCD_ 15表示您的平台支持CCD_。前一个线程解释了这在大多数情况下应该是正确的。

这可以使用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.

这是否可以将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);

其类似于用于分配的CCD_ 18对应物和CCD_。

// 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中对我有效。