C / C ++ NaN常数(文字)?


Answers:


153

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

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

但是,要检查一个值是否为NaN,就不能将其与另一个NaN值进行比较。而是使用isnan()来自<math.h>于C,或std::isnan()<cmath>C ++中。


20
或者,您可以将数字与其自身进行比较– 如果iff 是NaN,则x == x返回。falsex
阿奇,

7
@Archie:我认为两种语言都不能保证。
Mike Seymour

3
@MikeSeymour不是语言标准,但据我所知,如果编译器声称符合IEEE标准,它应该可以工作。
Pixelchemist 2013年

37
@Pixelchemist:的确,如果需要混淆而不是便携性,这是一个选择。就我个人而言,我更喜欢可移植性而不混淆,所以我不会自己建议。
Mike Seymour,

9
小注释:NAN是浮点数,而不是双精度数。链接
Orion elenzil 2014年

23

正如其他人指出的那样,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。

这为解释在这里,如果true手段的平台支持IEEE 754的标准。这前一个线程解释这应该是大多数情况下正确的。



1

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

1
不同字符串的输出之间有什么区别?在典型的数字代码中应该使用哪一个?
quant_dev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.