(This article was first published on

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.**Statistic on aiR**, and kindly contributed to R-bloggers)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...