R如何在内部表示NA?

5ssjco0h  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

R似乎在浮点数组中支持一个有效的NA值。它在内部是如何表示的?
我的理解(也许是错误的)是,现代CPU可以在硬件中执行浮点计算,包括有效处理Inf,-Inf和NaN值。NA如何适应这一点,以及如何在不影响性能的情况下实现它?

4c8rllxm

4c8rllxm1#

IEEE floats+Inf-Inf表示,指数中的所有位(第二位到第13位)设置为1,尾数中的所有位设置为0,而NaN具有非零尾数。R使用不同的尾数值来表示NaNNA_real_。我们可以使用一个简单的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_)
#> 7ff00000000007a2
print_hex(NaN)
#> 7ff8000000000000
print_hex(Inf)
#> 7ff0000000000000
print_hex(-Inf)
#> fff0000000000000

字符串
这里有一些源代码参考。

相关问题