首页 > 解决方案 > nan() 函数的参数

问题描述

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

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

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

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

标签: c++c++11floating-pointnan

解决方案


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

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

说明
2 nan, nanf, 和函数根据以下规则nanl转换 指向的字符串。tagpcallnan("n-char-sequence")就相当于strtod("NAN(n-char-sequence)", (char**)NULL);callnan("")就相当于strtod("NAN()", (char**)NULL)。如果tagp不指向 n 字符序列或空字符串,则调用等效于strtod("NAN",(char**)NULL). ...

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


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

tagp指向 0-9、AZ、az、_ 字符的序列。

  1. 如果tagp编译器不支持传递的参数会怎样?

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

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

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


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

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


推荐阅读