C中的NaN Literal?

你如何在C中编写NaN浮点字面值?

在C99的

  7.12 Mathematics  
  [#5] The macro NAN is defined if and only if the implementation supports quiet NaNs for the float type. It expands to a constant expression of type float representing a quiet NaN. | 

5.2.4.2.2 / 3:

浮动类型可能包含其他类型的浮点数,例如……在单位和NaN中。 NaN是表示非数字的编码。 一个安静的NaN几乎每次算术运算都会传播,而不会产生浮点exception; 信令NaN通常在作为算术操作数发生时引发浮点exception。

7.12 / 5(math.h):

当且仅当实现支持float类型的安静NaN时,才定义宏NAN 。 它扩展为float类型的常量表达式,表示安静的NaN。

因此, 如果您的实现完全支持NaN,并且某些或所有NaN都是安静的,那么您可以获得一个值。 如果你没有进入实现定义的领域。

还有一些浮点宏的担心,编译器前端可能不知道它是否支持该function,因为它产生的代码可以在支持变化的架构的多个版本上运行。 我不知道这是否适用于这个宏,但是另一种情况是你进入了实现定义的领域 – 预处理器可能保守地声称它不支持该function实际上作为一个整体实现,就像你’确实如此。

使用NAN更好,但是如果你在一个有NaNs的系统上, 0.0/0.0是一个简单的方法来获得一个……

在C中,您可以通过以下方式编写NaN浮点文字。

 const unsigned long dNAN[2] = {0x00000000, 0x7ff80000}; const double LITERAL_NAN = *( double* )dNAN; 

请注意,这不是标准方式。 在Microsoft C上,它工作正常。