创建包含字符序列的 nan 时,如何取回字符序列?

When creating a nan which contains a char-sequence, how do I get the char-sequence back?

做的时候

const double d = std::nan ("Hello");

你得到一个包含字符串 "Hello" 的 NAN。如何从变量 d 中取消这个字符串?是否根本没有符合标准的方式?如果无法取回字符串,此功能似乎意义不大。

这完全是对 std::nan 的误解。 参见 documentation

The call std::nan("n-char-sequence"), where n-char-sequence is a sequence of digits, Latin letters, and underscores, is equivalent to the call std::strtod("NAN(n-char-sequence)", (char**)nullptr);.

基本上"Not a Number"可以用一对不同的安静NAN来表示——无效浮点的表示。 std::nan 提供了一种生成此安静 NAN 的方法。这是必需的,因为常规 C++ 文字不提供这种能力。
所以它不会 "wrap" 任何类型的字符串,前提是字符串应该代表一个数字,否则你将收到 NAN 的常规表示。 "hello" 的使用毫无意义,字符串值不能是 d.

中的 regained/recreated

如果您想报告包含更多详细信息的错误,您应该使用 C++ 异常。例如 std::invalid_argument.
我没有例子说明定制相当 NAN 有用,也许其他人可以。

C++ 标准表示,在为 fprintf、其亲属 printf 以及继承自 [= 的 C++ 功能格式化时,实现可能会显示以 NaN 编码的数据10=],例如输出流格式化程序。这是 C++ 标准中关于获取有关 NaN 数据信息的唯一明确规定。 (我在 C 标准中包含了语句,C++ 通过引用将其合并。)关于这一点,该标准表示实现 可能 在格式化 NaN 时包含编码数据,但是它是以实现定义的方式,实现可以省略这个。

当然,您可以通过检查表示数据的字节来检查以 NaN 编码的数据。但是,如何处理传递给 nan 函数的字符是实现定义的。一个实现可以选择不对它们做任何事情,它可以将它们逐字地包含在 NaN 的字节中(如果它们适合),或者它可以编码或解释它们,例如期望字符串中的十六进制数字,它将被编码成NaN 的位。通常用于 double 的 IEEE-754 基本 64 位二进制浮点格式有 51 位可用于安静 NaN 的有效载荷,足以固定六个八位字符,因此字符串“Hello” 可以编码为 NaN。

以下是标准对 nan 函数的详细说明:

  • C++ 继承了 C 的 nan 函数,并将其留给 C 来指定它的作用。
  • C 表示 nan("n-char-sequence") 等价于 strtod("NAN(n-char-sequence)", (char**)NULL).
  • C 表示 n-char-sequencedigitnondigit 的序列人物。 数字字符为0-9,非数字字符为_、A-Z、a-z。所以字符串 "Hello" 是一个 n-char-sequence.
  • C 说,关于 strtod 和带有 *n-char-sequence 的“NAN”,n-char-sequence 的含义是实现定义的.

因此,一个实现 可能 对您在 nan 参数中提供的字节进行编码。

C 标准(和继承的 C++)关于格式化 NaN 的说法是:

  • “表示 NaN 的双精度参数转换为 [-]nan 或 [-]nan(n-char-sequence) 样式之一 —哪种样式以及任何 n-char-sequence 的含义是实现定义的。”