(This article was first published on Statistic on aiR, and kindly contributed to R-bloggers)
For some theory on the standard IEEE-754, you can read the Wikipedia page. Here I will post only the code of the function to make the conversion in R.First we write some functions to convert decimal numbers to binary numbers:
decInt_to_8bit <- function(x, precs) {
q <- c()
r <- c()
xx <- c()
for(i in 1:precs){
xx[1] <- x
q[i] <- xx[i] %/% 2
r[i] <- xx[i] %% 2
xx[i+1] <- q[i]
}
rr <- rev(r)
return(rr)
}
devDec_to_8bit <- function(x, precs) {
nas <- c()
nbs <- c()
xxs <- c()
for(i in 1:precs)
{
xxs[1] <- x*2
nas[i] <- (xxs[i]) - floor(xxs[i])
nbs[i] <- trunc(xxs[i], 1)
xxs[i+1] <- nas[i]*2
}
return(nbs)
}
For example, in 8-bit:
decInt_to_8bit(11, 8)
[1] 0 0 0 0 1 0 1 1
devDec_to_8bit(0.625, 8)
[1] 1 0 1 0 0 0 0 0
devDec_to_8bit(0.3, 8)
[1] 0 1 0 0 1 1 0 0
devDec_to_8bit(0.3, 16)
[1] 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
We can delete the extra-zeros from the vectors, using these functions:
remove.zero.aft <- function(a) {
n <- length(a)
for(i in n:1){
if (a[n]==0) a <- a[-n]
else return(a)
n <- n-1
}
}
remove.zero.bef <- function(a) {
n <- length(a)
for(i in 1:n){
if (a[1]==0) a <- a[-1]
else return(a)
}
}
So we have:
remove.zero.bef(decInt_to_8bit(11, 8))
[1] 1 0 1 1
remove.zero.aft(devDec_to_8bit(0.625, 8))
[1] 1 0 1
Binding these functions, we have:
dec.to.nbit <- function(x,n) {
aa <- abs(trunc(x, 1))
bb <- abs(x) - abs(trunc(x))
q <- c()
r <- c()
xx <- c()
for(i in 1:n){
xx[1] <- aa
q[i] <- xx[i] %/% 2
r[i] <- xx[i] %% 2
xx[i+1] <- q[i]
}
rr <- rev(r)
nas <- c()
nbs <- c()
xxs <- c()
for(i in 1:n)
{
xxs[1] <- bb*2
nas[i] <- (xxs[i]) - floor(xxs[i])
nbs[i] <- trunc(xxs[i], 1)
xxs[i+1] <- nas[i]*2
}
bef <- paste(remove.zero.bef(rr), collapse="")
aft <- paste(remove.zero.aft(nbs), collapse="")
bef.aft <- c(bef, aft)
strings <- paste(bef.aft, collapse=".")
return(strings)
}
Example:
dec.to.nbit(11.625,8)
[1] "1011.101"
Now we can write the code for the decimal to IEEE-754 single float conversion in R:
dec.to.ieee754 <- function(x) {
aa <- abs(trunc(x, 1))
bb <- abs(x) - abs(trunc(x))
rr <- decInt_to_8bit(aa, 32)
ppc <- 24 - length(remove.zero.bef(rr))
nbs <- devDec_to_8bit(bb, ppc)
bef <- remove.zero.bef(rr)
aft <- remove.zero.aft(nbs)
exp <- length(bef) - 1
mantissa <- c(bef[-1], aft)
exp.bin <- decInt_to_8bit(exp + 127, 16)
exp.bin <- remove.zero.bef(exp.bin)
first <- c()
if (sign(x)==1) first=c(0)
if (sign(x)==-1) first=c(1)
ieee754 <- c(first, exp.bin, mantissa, rep(0, 23-length(mantissa)))
ieee754 <- paste(ieee754, collapse="")
return(ieee754)
}
The numbers 11.625 and 11.33 in IEEE-754 are:
dec.to.ieee754(11.625)
[1] "01000001001110100000000000000000"
dec.to.ieee754(11.33)
[1] "01000001001101010100011110101110"
You can verify the output with this Online Binary-Decimal Converter
To leave a comment for the author, please follow the link and comment on his blog: Statistic on aiR.
R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

Zero Inflated Models and Generalized Linear Mixed Models with R.
Zuur, Saveliev, Ieno (2012).