I am interested at looking at the underlying binary (or hex) representation of numbers in R. Is there a way, for example, to see what the underlying representation of a double is? Is there a way to supply a binary/hex value and then tell R to regard it as a double?
For 32 bit integers:
i <- 10 # raw vector intToBits(i) #string paste(rev(as.integer(intToBits(i))), collapse = "") # remove leading zeroes as.character(as.integer(paste(rev(as.integer(intToBits(i))), collapse = ""))) # same result R.utils::intToBin(i)
64 bit integers require a slightly different solution.
For non-integers you can use the solution here: r - Converting non-integer decimal numbers to binary - Stack Overflow
This is definitely helpful, but for floating point numbers doesn't necessarily give you the binary representation. For example, following the link supplied:
floatToBin(NA) [1] "NA.NA"
Why NA ? Why not a float ?
I would like to be able to see how NA is represented. (My understanding is that R uses the standard IEEE representation, but I'd like to see for myself.)
I provided a link for you for floating point numbers.
You did, and I appreciate it. But I would also like to see the representation of a double NA. The linked code won't do that.
I'm kid of surprised there isn't a way to see the hex representation of pretty much anything, but maybe there isn't
A floating point number would be NA, not NA.NA.
NA
NA.NA
Clearly there is something I'm not understanding. Unless I've screwed up, the floatToBin function is what you pointed me at. When I call it with NA I get the result shown. What should I be doing instead?
floatToBin
That was a user-defined function written on SO by somebody to answer a related question to yours. Such questions rarely cover all cases. Indeed the poster stated it did not cover negative numbers. If you want a more comprehensively applicable function you'll either have to search a bit further yourself or just extend the example function to cover any cases like NAs, negative numbers, etc.
I'm sure you're right. I was hoping for an existing function that would show the 16 hex digits of whatever is stored as a double. (And maybe one that would take 16 hex digits and stuff them into a double.) Maybe such a thing doesn't exist.
I did a better Google search than I had before and found https://stackoverflow.com/questions/50217954/double-precision-64-bit-representation-of-numeric-value-in-r-sign-exponent which offers the code
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>")``` This gives
print_hex(0.1) 3fb999999999999a print_hex(NA) 7ff00000000007a2
This topic was automatically closed 7 days after the last reply. New replies are no longer allowed. If you have a query related to it or one of the replies, start a new topic and refer back with a link.