是否可以将NaN
分配给C / C ++中的double
或float
?就像在JavaScript中一样:a = NaN
。所以稍后您可以检查变量是否为数字。
答案 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
简而言之,有三个: