C/C++ NaN 常量(字面量)?

Posted

技术标签:

【中文标题】C/C++ NaN 常量(字面量)?【英文标题】:C/C++ NaN constant (literal)? 【发布时间】:2013-05-17 11:19:24 【问题描述】:

这是否可以在 C/C++ 中将 NaN 分配给 doublefloat?就像在 javascript 中一样:a = NaN。所以稍后你可以检查变量是否是数字。

【问题讨论】:

这里我展示了通过不同方式生成各种 NaN 时的样子:***.com/questions/18118408/… 【参考方案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 中对我有用。

【讨论】:

NULLNaN其实不一样 是的,它们本质上是不同的,但是在检查变量是否为数字的意义上,使用 NULL 或 NaN 是相同的。 "它对我有用" 但与问题完全无关。问题是如何将NAN 分配给floatdouble。此答案不包含NAN 或任何floatdouble【参考方案2】:

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

【讨论】:

不同字符串的输出有什么区别?我们应该在典型的数字代码中使用哪一个? @quant_dev x = NAN; 满足大多数需求,否则x = nan("0x12345"); 是指定有效负载的明确方法。有效负载内容差异是实现定义的。通常 52 位有效载荷的 MSBit 是 quiet / signaling 标志。见NAN。【参考方案3】:

正如其他人指出的那样,您正在寻找std::numeric_limits&lt;double&gt;::quiet_NaN(),尽管我不得不说我更喜欢cppreference.com 文档。特别是因为这句话有点含糊:

仅当 std::numeric_limits::has_quiet_NaN == true 时才有意义。

如果你在std::numeric_limits::has_quiet_NaN查看他们的部分,很容易弄清楚这在这个网站上意味着什么,它说:

此常量对所有浮点类型都有意义,并且如果 std::numeric_limits::is_iec559 == true 则保证为 true。

正如here 所解释的,如果true 意味着您的平台支持IEEE 754 标准。这个previous thread 解释了这在大多数情况下应该是正确的。

【讨论】:

【参考方案4】:

在 C 中,NAN&lt;math.h&gt; 中声明。

在 C++ 中,std::numeric_limits&lt;double&gt;::quiet_NaN()&lt;limits&gt; 中声明。

但是为了检查一个值是否为 NaN,你不能将它与另一个 NaN 值进行比较。而是使用 C 中 &lt;math.h&gt; 中的 isnan() 或 C++ 中 &lt;cmath&gt; 中的 std::isnan()

【讨论】:

或者您可以将数字与自身进行比较 - x == x 返回 false iff x 是 NaN。 @Archie:我认为这两种语言都不能保证。 @MikeSeymour 不是按照语言标准,但据我所知,如果编译器声称符合 IEEE 标准,它应该工作。 @Pixelchemist:确实,如果您需要混淆而不是可移植性,这是一个选择。就个人而言,我更喜欢没有混淆的可移植性,所以我自己不会建议。 次要注意:NAN 是浮点数,而不是双精度数。 link【参考方案5】:

这可以使用 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.

【讨论】:

+1。***有一些关于quiet NaN 和signaling NaN 的信息。

以上是关于C/C++ NaN 常量(字面量)?的主要内容,如果未能解决你的问题,请参考以下文章

你所没有听说过的常量变量字面量在这里!

你所没有听说过的常量变量字面量在这里!

你所没有听说过的常量变量字面量在这里!

Javascript 对象字面量:a, b, c 到底是啥?

C++基础知识之常量(字面量) 变量

java 常量池