R如何在内部代表NA?

时间:2018-08-04 10:54:36

标签: r floating-point na internal-representation

R似乎在浮点数组中支持有效的NA值。它在内部如何表示?

我的理解(也许是有缺陷的)是,现代CPU可以在硬件中执行浮点计算,包括有效处理Inf,-Inf和NaN值。 NA如何适应这一需求?如何在不影响性能的情况下实现它?

1 个答案:

答案 0 :(得分:1)

R使用为IEEE floats定义的NaN值来表示NA_real_InfNA。我们可以使用一个简单的C ++函数对此进行明确显示:

Rcpp::cppFunction('void print_hex(double x) {
    uint64_t y;
    static_assert(sizeof x == sizeof y, "Size does not match!");
    std::memcpy(&y, &x, sizeof y);
    Rcpp::Rcout << std::hex << y << std::endl;
}', plugins = "cpp11", includes = "#include <cstdint>")
print_hex(NA_real_)
#> 7ff80000000007a2
print_hex(Inf)
#> 7ff0000000000000
print_hex(-Inf)
#> fff0000000000000

指数(第二至13位)全部为1。这是IEEE NaN的定义。但是,尽管Inf的尾数全为零,但NA_real_的情况并非如此。这里有些source code references