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

时间:2013-05-22 12:01:10

标签: c++ nan

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

6 个答案:

答案 0 :(得分:132)

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

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

但是为了检查值是否为NaN,您无法将其与另一个NaN值进行比较。而是使用C中isnan()的{​​{1}}或C ++中来自<math.h>的{​​{1}}。

答案 1 :(得分:22)

正如其他人指出你正在寻找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,则保证为真。

here所述,如果true表示您的平台支持IEEE 754标准。这个previous thread解释了在大多数情况下这应该是正确的。

答案 2 :(得分: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.

答案 3 :(得分:2)

是否可以为C中的double或float分配NaN?

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

答案 4 :(得分:-1)

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

答案 5 :(得分:-15)

通常,在程序中包含无效数字并不是一个好主意。以后摆脱它们可能非常困难,它们可能导致程序崩溃。

这里列出了很好的方法来捕捉这些数字而不将其分配给他们:https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing-errors

简而言之,有三个:

  • 比较
  • 使用c ++ 11标准
  • 使用控制字_controlfp和_control87