nan()函数的参数

时间:2019-12-30 14:44:21

标签: c++ c++11 floating-point nan

有时需要获取NaN值(例如,从函数中将其作为错误值返回)。 С++ 11提供了double nan(const char* tagp);函数来获取NaN参见doc。此函数获取C字符串参数tagp,其中:

  库实现可以使用

来区分不同的NaN   值以实现特定的方式。如果这是一个空字符串(“”),则该函数返回通用NaN值

我想更深入地了解此功能。有人可以详细解释

  1. 除了空字符串“”之外,还可以使用哪些tagp值?在哪里可以找到可能的值列表?
  2. 如果传递的tagp参数错误或编译器不支持怎么办?
  3. 在跨平台代码中使用特定于实现的功能是否安全?

1 个答案:

答案 0 :(得分:2)

  

С++ 11提供了double nan(const char* tagp);

一些C章和经文(C17§7.12.11.2)

  

说明
   2 nannanfnanl函数根据以下规则转换tagp指向的字符串。呼叫nan("n-char-sequence")等效于strtod("NAN(n-char-sequence)", (char**)NULL);,呼叫nan("")等效于strtod("NAN()"(char**)NULL)。如果tagp没有指向n字符序列或空字符串,则调用等效于strtod("NAN",(char**)NULL)。 ...

     

退货
  3 nan函数返回一个安静的NaN(如果可用),其内容通过tagp指示。如果实现不支持静默NaNs,则函数返回零。


  1. 除了空字符串“”之外,还可以使用哪些tagp值?在哪里可以找到可能的值列表?

tagp指向一个0-9,A-Z,a-z和_字符的序列。

  1. 如果编译器不支持传递的tagp参数,会发生什么情况?

如果C / C ++规范不支持,则“该调用等效于strtod("NAN",(char**)NULL)”。这会导致实现定义的结果。

  1. 在跨平台代码中使用特定于实现的功能是否安全?

是的,可以安全地避免出现未定义的行为。但是,含义和派生的NAN是特定于实现的。


n-char-sequence 解释为NAN有效载荷的十进制表示形式是可能的结果,但受上述限制。

另请参阅What uses do floating point NaN payloads have?和Wiki NaN