有时需要获取NaN
值(例如,从函数返回它作为错误值(。 С++11提供了double nan(const char* tagp);
函数来获取NaN
查看文档。此函数获取 C 字符串参数tagp
其中:
库实现可用于区分不同的 NaN 实现特定方式的值。如果这是一个空字符串 ("(,则该函数返回一个通用 NaN 值
我想更深入地了解这个功能。有人可以更详细地解释一下吗
- 除了空字符串 " 之外,还可以使用哪些
tagp
值?在哪里可以找到可能值的列表? - 如果传递的
tagp
参数错误或编译器不支持,会发生什么情况? - 在跨平台代码中使用此特定于实现的函数是否安全?
С++11 提供了
double nan(const char* tagp);
一些C章和经文(C17 § 7.12.11.2(
描述
2nan
、nanf
和nanl
函数根据以下规则转换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
,则函数返回零。
- 除了空字符串 " 之外,还可以使用哪些标记值?在哪里可以找到可能值的列表?
tagp
指向 0-9、A-Z、a-z、_ 字符的序列。
- 如果编译器不支持传递的
tagp
参数,会发生什么情况?
如果 C/C++ 规范不支持,则"调用等效于strtod("NAN",(char**)NULL)
"。 这会导致实现定义的结果。
- 在跨平台代码中使用此特定于实现的函数是否安全?
是的,在未定义的行为中不安全。 然而,含义和派生的 NAN 是特定于实现的。
将n 字符序列解释为 NAN 有效负载的十进制表示是受上述限制的可能结果。
参见 浮点 NaN 有效负载有什么用途? 和维基 NaN