web-dev-qa-db-ja.com

std :: nuder_limits :: quiet_NaN()vs。std :: nan()vs。NAN

静かなNaN値を表すC++機能の数に驚きました。私は3つの標準的な方法を見つけました:

  1. std::numeric_limits<T>::quiet_NaN()-ジェネリック、そして私はそれが選ばれたものだと思った
  2. std::nanstd::nanfstd::nanl-const char*引数を受け入れる関数のファミリー
  3. NAN-「静かな非数に評価される」マクロ

EachこれらのうちC++ 11で導入されました。これに関していくつか質問があります。

  1. const char*引数はstd::nanおよびcoで何を表しますか?どのように使用されますか?
  2. この目的のためにジェネリックトレイトクラスをすでに追加しているのに、なぜC++ 11にmacroを追加する必要があるのでしょうか。 (Cとの互換性のためですか?)
  3. デフォルトで使用する必要があるものは何ですか? (これが最初だと思います)
11
Mikhail

std::nanstd::nanlおよびstd::nanfC Mathライブラリから継承されます ; NANマクロ もそうです。それらはすべてCに住んでいます <math.h> 。ただし、@ NicolBolasが示唆しているように、これらはANSI Cの一部ではなく、C言語標準の新しいバージョンであるC99の一部であったため、C++ 11でのみ導入されました。 C++標準委員会は、いわばC互換性を「更新」する努力をしていました。

std::numeric_limits<T> はC++自体(C++ 11よりかなり前)用に設計されており、それを使用します。

つまり、最終的な答えは、C99の互換性です。

11
einpoklum