IEEE-754 NaN 和缺失数据

计算科学 浮点
2021-11-28 08:42:02

我希望 - 如果可能的话 - 以标准 IEEE-754 格式表示和处理缺失的数据(在统计意义上)。看到对于 SNaN 和 QNaN 来说,各种位表示都是可能的,我想知道它们是否都可以从标准计算中产生,或者一些可以使除了相应的显式位存储之外的路径无法访问,因此安全并保留以表示“空槽”对于丢失的数据。

因此,首先,标准是否规定了表示 NaN 的特定行为,或者每个处理器/系统是否可以不同地对待它们?在前一种情况下,我可以做上面暗示的事情吗?(假设在 C++ 中通过 static_cast 或联合检测这些值是安全的)

IEEE 标准通常为某些未定义的操作规定 NaN,但不是特定的有效载荷。我想知道这是否有一个事实上的标准。我不在乎外部库是否每个都有自己的有效负载,但如果标准 C++ 库不一致,那就更严重了。

1个回答

我想知道它们是否都可以从标准计算中产生……

这是依赖于实现的,如果一个库将它自己的有效负载分配给它的 NaN,它的有效负载很可能与您自己的有效负载发生冲突。我会说这不太可能是一个大问题,但请查看文档。

我也相信这种方法是 R 用于丢失数据的方法(https://cran.r-project.org/doc/manuals/R-lang.pdf第 3.3.4 节)。StackOverflow 上相关问题的相关现有答案在这里这里

那么首先,标准是否规定了表示 NaN 的特定行为,或者每个处理器可以不同地对待它们?

接收一个或多个 NaN 作为输入的操作通常应返回其中一个 NaN 作为输出,因此有效负载被保留。

在前一种情况下,我可以做上面暗示的事情吗?

是的,我相信这就是为什么 NaN 应该有有效载荷的最初想法。它有助于调试并用于表示丢失的数据。

假设在 C++ 中通过 static_cast 或联合检测这些值是安全的

实际上,由于 IEEE754 浮点数的二进制表示是已知的,因此只需通过一些操作(例如,关于 SO 的这个现有问题)来提取有效负载reinterpret_cast安全static_cast在这里没有做正确的事情,并且使用 union 执行此操作是(技术上)未定义的行为,但无论如何都会正常工作。