std::numeric_limits::quiet_NaN() 对比 std::nan() 对比 NAN

std::numeric_limits::quiet_NaN() vs. std::nan() vs. NAN

我对表示安静 NaN 值的 C++ 工具的数量感到惊讶。我找到了三种标准方式:

  1. std::numeric_limits<T>::quiet_NaN() - 通用,我认为它是选择的
  2. std::nanstd::nanfstd::nanl - 函数族接受 const char* 参数
  3. NAN - 一个宏,"which evaluates to a quiet not-a-number"

其中每个 都是在 C++11 中引入的。我对此有几个问题:

  1. const char* 参数在 std::nan 和 co 中代表什么?它是如何使用的?
  2. 为什么我们需要在 C++11 中添加一个 ,而我们已经为此目的添加了一个通用特征 class? (是为了兼容C?)
  3. 默认情况下我应该使用什么? (我想这是第一个)

std::nanstd::nanlstd::nanf are inherited from the C Math library; so is the NAN macro. They all live in C's <math.h>。然而,正如@NicolBolas 所暗示的那样,它们仅在 C++11 中引入,因为它们不是 ANSI C 的一部分,而是 C99 的一部分,C99 是 C 语言标准的更新版本。 C++ 标准委员会正在努力'update' C 兼容性,可以这么说。

std::numeric_limits<T> 是为 C++ 本身设计的(早于 C++11),这就是我要使用的。

所以,底线答案是:C99 兼容性。