nan() 函数的参数



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

库实现可用于区分不同的 NaN 实现特定方式的值。如果这是一个空字符串 ("(,则该函数返回一个通用 NaN 值

我想更深入地了解这个功能。有人可以更详细地解释一下吗

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

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

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

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

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


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

tagp指向 0-9、A-Z、a-z、_ 字符的序列。

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

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

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

是的,在未定义的行为中不安全。 然而,含义和派生的 NAN 是特定于实现的。


n 字符序列解释为 NAN 有效负载的十进制表示是受上述限制的可能结果。

参见 浮点 NaN 有效负载有什么用途? 和维基 NaN

最新更新