Answers:
在C中,NAN
在中声明<math.h>
。
在C ++中,std::numeric_limits<double>::quiet_NaN()
在中声明<limits>
。
但是,要检查一个值是否为NaN,就不能将其与另一个NaN值进行比较。而是使用isnan()
来自<math.h>
于C,或std::isnan()
从<cmath>
C ++中。
x == x
返回。false
x
正如其他人指出的那样,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。
这可以使用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);
就像他们的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)