R似乎在浮点数组中支持一个有效的NA值。它在内部是如何表示的?我的理解(也许是错误的)是,现代CPU可以在硬件中执行浮点计算,包括有效处理Inf,-Inf和NaN值。NA如何适应这一点,以及如何在不影响性能的情况下实现它?
NA
4c8rllxm1#
用IEEE floats+Inf和-Inf表示,指数中的所有位(第二位到第13位)设置为1,尾数中的所有位设置为0,而NaN具有非零尾数。R使用不同的尾数值来表示NaN和NA_real_。我们可以使用一个简单的C++函数来明确这一点:
+Inf
-Inf
NaN
NA_real_
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
字符串这里有一些源代码参考。
1条答案
按热度按时间4c8rllxm1#
用IEEE floats
+Inf
和-Inf
表示,指数中的所有位(第二位到第13位)设置为1,尾数中的所有位设置为0,而NaN具有非零尾数。R使用不同的尾数值来表示NaN
和NA_real_
。我们可以使用一个简单的C++函数来明确这一点:字符串
这里有一些源代码参考。