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)?
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
Run Code Online (Sandbox Code Playgroud)double nan(const char *tagp); long double nanl(const char *tagp); float nanf(const char *tagp);描述nan()函数返回一个安静的NaN,其尾随分数字段包含将tagp转换为无符号整数的结果.如果tagp太大而不能包含在NaN的尾随分数字段中,则使用由tagp表示的整数的最低有效位.
特殊值如果tagp包含任何非数字字符,则该函数返回尾随分数字段为零的NaN.
如果tagp为空,则该函数返回尾随分数字段为零的NaN.
标准nan()函数符合ISO/IEC 9899:2011.
BSD 2008年7月1日