【发布时间】:2017-12-23 19:17:28
【问题描述】:
我在 LINUX RHEL 64bit 中编写代码,并使用 C++98。
我有一个浮点值数组,我想将一些值“标记”为“无效”。一种可能的解决方案是使用另一个位数组来判断相应的值是否有效。
我想知道我们是否可以使用任何特殊的双精度值。链接Why does IEEE 754 reserve so many NaN values? 表示有很多 NaN 值。我们可以使用为我的问题保留的任何值吗?
- 根据我的定义,我只需要有效负载中的一位来指示双精度值是否“有效”。输入的双精度值可以包含 NaN,但我认为它不会使用任何有效负载。
- 双精度值将以二进制模式保存到文件中(逐位保存双精度值)。
- 那么代码也会以二进制模式从文件中读取数据
- 对于从文件中读取的每个双精度值,我们首先通过有效负载中设置的位检查它是否有效,然后再进行任何其他计算。
【问题讨论】:
-
请注意,并非每个支持 NaN 的平台都必须支持 NaN“有效负载”。 IEEE-754 允许使用单个规范 NaN。在实践中,大多数平台都支持 NaN 负载,您通常可以通过 C 和 C++ 的标准库函数
nan()以实现定义的方式设置它们。 -
C++ 中的 nan 适用于 C++11。我们只有 std::numeric_limits
::quiet_NaN() 用于旧 C++。而且它不支持设置有效载荷。通过位掩码设置是否安全...? -
是的,您可以使用位操作来访问 NaN 编码,前提是考虑到有关类型重新解释的正常警告。我认为 C++11 是人们此时使用的。我认为,如果您能澄清您计划使用的编程语言和操作系统平台、您需要多少种不同的编码以及您计划如何使用这些编码(例如,是否需要不只是设置,但还要检查程序内部使用的特定编码?我认为没有C/C++标准函数。
-
@njuffa 我更新了我原来的问题来解决你的问题。
-
在问题中提及目标平台会有所帮助,因为一些软件环境已经为自己的目的预先定义了一些可用的 NaN 编码。我在answer 中针对相关问题给出的具体示例是各种 Apple 平台。
标签: floating-point nan ieee-754