std::numeric_limits::quiet_NaN() 对比 std::nan() 对比 NAN
std::numeric_limits::quiet_NaN() vs. std::nan() vs. NAN
我对表示安静 NaN 值的 C++ 工具的数量感到惊讶。我找到了三种标准方式:
std::numeric_limits<T>::quiet_NaN()
- 通用,我认为它是选择的
std::nan
、std::nanf
、std::nanl
- 函数族接受 const char*
参数
NAN
- 一个宏,"which evaluates to a quiet not-a-number"
其中每个 都是在 C++11 中引入的。我对此有几个问题:
const char*
参数在 std::nan
和 co 中代表什么?它是如何使用的?
- 为什么我们需要在 C++11 中添加一个 宏 ,而我们已经为此目的添加了一个通用特征 class? (是为了兼容C?)
- 默认情况下我应该使用什么? (我想这是第一个)
std::nan
、std::nanl
和 std::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 兼容性。
我对表示安静 NaN 值的 C++ 工具的数量感到惊讶。我找到了三种标准方式:
std::numeric_limits<T>::quiet_NaN()
- 通用,我认为它是选择的std::nan
、std::nanf
、std::nanl
- 函数族接受const char*
参数NAN
- 一个宏,"which evaluates to a quiet not-a-number"
其中每个 都是在 C++11 中引入的。我对此有几个问题:
const char*
参数在std::nan
和 co 中代表什么?它是如何使用的?- 为什么我们需要在 C++11 中添加一个 宏 ,而我们已经为此目的添加了一个通用特征 class? (是为了兼容C?)
- 默认情况下我应该使用什么? (我想这是第一个)
std::nan
、std::nanl
和 std::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 兼容性。