NaN生成函数的"char-sequence"参数是什么?

msh*_*ldt 8 c standards c99 nan

除了NAN宏之外,C99还有两种方法可以为浮点数生成NaN值,即nanf(const char *tagp)函数和strtof("NAN(char-sequence)").

这两种生成NaN的方法都采用可选的字符串参数(*tagp in nanf()和strtof方法中的char-sequence).这个字符串参数到底是做什么的?我还没有找到任何具体的例子来说明你如何使用它.来自cppreference.com我们有:

调用nan("string")等效于调用strtod("NAN(string)",(char**)NULL);

调用nan("")等同于调用strtod("NAN()",(char**)NULL);

调用nan(NULL)等效于调用strtod("NAN",(char**)NULL);

nan(3) 说:

这些函数返回一个安静的NaN的表示(由tagp确定).[snip]参数tagp以未指定的方式使用.在IEEE 754系统上,有许多NaN表示,tagp选择一个.

这并没有真正告诉我我可以用于tagp字符串或为什么我想要使用它.此标记字符串的有效选项中是否有列表,以及使用默认值的原因是什么nanf(NULL)

ben*_*ank 8

Tl; Dr:tagp参数使您能够具有不同的NAN值.

这是来自nan(3)的手册页,它提供了更多的信息tagp.

主要是:

nan()函数返回一个安静的NaN,其尾随分数字段包含将tagp转换为无符号整数的结果.

这使您能够具有不同的 NAN值.

具体来自C99 Rationale doc:

NaN的其他应用可能证明是有用的.NaN的可用部分已被用于编码辅助信息,例如关于NaN的来源.信令NaN可能是填充未初始化存储的候选者; 它们的可用部分可以区分未初始化的浮动物体.IEC 60559信令NaN和陷阱处理程序可能提供用于维护诊断信息或实现特殊算术的钩子.

还有就是它的实现在这里.请注意,这可能是也可能不是标准符合,如评论中所述.但是,它应该让你知道tagp用于什么.

在手册页中,您可以看到上面提到的替换:

nan("1") = nan (7ff8000000000001)
nan("2") = nan (7ff8000000000002)
Run Code Online (Sandbox Code Playgroud)

完整的手册页:

NAN(3)BSD库函数手册
NAN(3)

NAME nan - 生成一个安静的NaN

大纲#include

 double
 nan(const char *tagp);

 long double
 nanl(const char *tagp);

 float
 nanf(const char *tagp);
Run Code Online (Sandbox Code Playgroud)

描述nan()函数返回一个安静的NaN,其尾随分数字段包含将tagp转换为无符号整数的结果.如果tagp太大而不能包含在NaN的尾随分数字段中,则使用由tagp表示的整数的最低有效位.

特殊值如果tagp包含任何非数字字符,则该函数返回尾随分数字段为零的NaN.

如果tagp为空,则该函数返回尾随分数字段为零的NaN.

标准nan()函数符合ISO/IEC 9899:2011.

BSD 2008年7月1日

  • 重要的是要注意,没有标准指定如何将`tagp`转换为NaN的有效载荷.标准在这一点上是刻意模糊的,以允许实现自由地执行诸如存储对有效载荷中导致NaN的原因的自然语言解释的散列的事情.绝大多数实现要么只是忽略`tagp`参数,要么将其解释为整数,但你不应该认为是这种情况. (4认同)