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

exe*_*ook 100 c++ nan

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

Mik*_*our 141

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

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

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

  • @Pixelchemist:的确,如果你需要混淆但不是可移植性,这是一个选择.就个人而言,我更喜欢没有混淆的便携性,所以我不会自己提出建议. (36认同)
  • 或者您可以将数字与自身进行比较 - 如果`x`是NaN,则`x == x`返回`false`. (18认同)
  • 小调:NAN是浮点数,不是双精度数.[链接](http://www.cplusplus.com/reference/cmath/NAN/) (8认同)
  • @Archie:我认为这两种语言都不能保证. (6认同)
  • @MikeSeymour不是语言标准,但据我所知,如果编译器声称符合IEEE标准,那么_should_工作. (3认同)
  • @MikeSeymour `(x == x) == false` 在 Java 中得到保证,请参阅 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang /Float.java#Float.isNaN%28float%29 (2认同)
  • 西蒙,没有“-NaN”。这只是“NaN”。如果你计算“-NaN”,你会得到“NaN”。有一堆奇怪的 NaN 没有人使用,并且 std::isnan() 应该对所有这些都返回 true。或者至少是安静的 NaN,我不知道如果传递一个信号 NaN 是否会发出信号。 (2认同)

Sha*_*our 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,则保证为true.

这为解释在这里,如果true意味着你的平台支持IEEE 754的标准.这个先前的线程解释了在大多数情况下这应该是正确的


lan*_*tar 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.
Run Code Online (Sandbox Code Playgroud)

  • +1.维基百科有一些关于[安静的NaN](http://en.wikipedia.org/wiki/NaN#Quiet_NaN)和[信号NaN](http://en.wikipedia.org/wiki/NaN#Signaling_NaN)的信息. (5认同)

chu*_*ica 7

在 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);
Run Code Online (Sandbox Code Playgroud)

这就像他们的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);
Run Code Online (Sandbox Code Playgroud)

示例输出:(取决于实现)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)
Run Code Online (Sandbox Code Playgroud)

...检查变量是否是数字。

使用isnan(), std::isnan()来自<math.h>, <cmath>.

  • @quant_dev `x = NAN;` 满足大多数需求,否则 `x = nan("0x12345");` 是指定有效负载的明确方法。有效负载内容差异是实现定义的。通常,52 位有效负载的 MSBit 是_quiet_ / _signaling_ 标志。请参阅 [NAN](https://en.wikipedia.org/wiki/NaN#Floating_point)。 (2认同)