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

标签 c++ floating-point ieee-754

做的时候

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

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

最佳答案

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

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

以下是标准对 nan 函数的解释:

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

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

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

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

关于c++ - 创建包含字符序列的 nan 时,如何取回字符序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51871993/

相关文章:

c++ - 如何处理警告C4177 : #pragma 'float_control' should only be used at global scope or namespace scope

c++ - 为什么在 C++17 中使用十六进制浮点常量?

c - IEEE-754 在 C 中 float

python - 如何将十六进制字符串转换为解压缩的 IEEE 754 格式数字 :-

javascript - 解析十六进制 float

c++ - Visual Studio 2010 C++ 是否完全支持类内 const 变量?

c++ - 为什么 std::string s ("??<") 输出 { 而不是预期的 ??< ?

math - float 学有问题吗?

c++ - 将 float 宏与 int* 一起切换 - 它有什么作用?

c++ - 尽管使用了 setwindowpos,为什么窗口没有出现在顶部?