在C/C++中,是否可以将NaN
赋值给double
或float
?就像在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()
函数。
x
为 NaN 时,x == x
的结果为 false
。 - Archiestd::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。
这可以使用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.
在C语言中,可以将NaN赋值给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)
... 检查变量是否为数字。
使用 <math.h>
或 <cmath>
中的 isnan(),std::isnan()
。
x = NAN;
可以满足大部分需求,否则 x = nan("0x12345");
是一种清晰的指定有效负载的方式。有效负载内容的差异是实现定义的。通常,52位有效负载的MSB是一个“quiet”/“signaling”标志。请参见NAN。 - chux - Reinstate Monicax = nan("0x12345");
而不是通用的 NAN
?我的意思是为什么我们需要说 0x12345
是一个 NaN? - afp_2008NAN
之外的其他内容,例如表示安静/信号或某些其他元数据时,可以使用nan("some_numeric_string")
。这有点像这个的重新解释。如果您需要更多信息,请提出一个具体的问题?我记得有一个系统标记了地址的低位,以帮助确定NAN的来源。 - chux - Reinstate Monica是的,通过指针的概念,您可以像这样为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中对我有效。
NAN
赋给float
或double
类型变量。这个回答中没有涉及到NAN
、float
或double
。请注意保持原意,并尽可能使语言更通俗易懂。 - wovano