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

问题描述 投票:0回答:2

做的时候

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

你会得到一个包含字符串“Hello”的 NAN。如何从变量

d
中取出该字符串?难道就没有符合标准的方法吗?如果无法取回字符串,此功能似乎没有什么意义。

c++ floating-point nan ieee-754
2个回答
4
投票

C++ 标准规定,当实现将数据格式化为

fprintf
、其亲属(例如
printf
)以及继承自
fprintf
的 C++ 功能(例如输出流格式化程序)时,实现可能会显示以 NaN 编码的数据。这是 C++ 标准中唯一明确的用于获取 NaN 中数据信息的规定。 (我在 C 标准中包含了语句,C++ 通过引用合并了这些语句。)关于这一点,该标准表示,实现在格式化 NaN 时可能包括编码数据,但它是采用实现定义的方式,并且实现可能会忽略这一点。 当然,您可以通过检查表示 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-sequence
  • 是由 digitnondigit 字符组成的序列。 数字字符是0-9,非数字字符是_、A-Z和a-z。所以字符串 "Hello" 是一个
    n-char-sequence
    C 表示,关于带有 *n-char-sequence 的“NAN”的
  • strtod
  • n-char-sequence
    的含义是实现定义的。
  • 因此,实现
可能

对您在nan参数中提供的字节进行编码。


C 标准(以及通过继承的 C++)关于格式化 NaN 的说法是:

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

0
投票
std::nan

的作用。 请参阅

文档

调用 std::nan("n-char-sequence"),其中 n-char-sequence 是 数字、拉丁字母和下划线的序列相当于 调用 std::strtod("NAN(n-char-sequence)", (char**)nullptr);.

基本上“不是数字”可以用几个不同的安静 NAN 来表示 - 无效浮点的表示。
std::nan

提供了一种生成这种安静的 NAN 的方法。这是必需的,因为常规 C++ 文字不提供这种能力。

所以它不会“包装”任何类型的字符串,前提是字符串应该表示数字,否则您将收到 NAN 的常规表示形式。使用“hello”是没有意义的,并且无法从您的 
d
中重新获得/重新创建字符串值。

如果您想报告错误并提供更多详细信息,您应该使用 C++ 异常。例如

std::invalid_argument

我没有例子说明自定义完全 NAN 有用,也许其他人可以。

© www.soinside.com 2019 - 2024. All rights reserved.