# Issue

The first line gives me 0.1 and the second line gives me 0.10000000000000001. Why does this happen? Is rounding a viable solution? Or is there a more precise solution? I would expect the first line to be "0.1" and the second line to be 0.1.

```
print(input[[nm]][[i+j]])
print(as.numeric(input[[nm]][[i+j]]))
[1] "0.1"
[1] 0.10000000000000001
```

# Solution

This is controlled by the `digits`

setting in your options. `options("digits")`

will tell you the current value, `options(digits=8)`

(for example) will set the value. The "extra" values at the end are due to floating-point error (see Chapter 1 of The R Inferno or search Stack Overflow for question about floating point, e.g. this one. (Note that this doesn't change the *underlying value*, just the way it is printed.)

It's impossible to express 0.1 *exactly* in binary floating-point representation.

Here's what gets printed with different digits settings (it looks like you must have `digits`

set to 17 ...)

```
x <- "0.1"
for (i in 1:20) print(c(i,as.numeric(x)), digits=i)
[1] 1.0 0.1
[1] 2.0 0.1
[1] 3.0 0.1
[1] 4.0 0.1
[1] 5.0 0.1
[1] 6.0 0.1
[1] 7.0 0.1
[1] 8.0 0.1
[1] 9.0 0.1
[1] 10.0 0.1
[1] 11.0 0.1
[1] 12.0 0.1
[1] 13.0 0.1
[1] 14.0 0.1
[1] 15.0 0.1
[1] 16.0 0.1
[1] 17.00000000000000000 0.10000000000000001
[1] 18.000000000000000000 0.100000000000000006
[1] 19.0000000000000000000 0.1000000000000000056
[1] 20.00000000000000000000 0.10000000000000000555
```

As you suggest in your comment, you can use `all.equal()`

to test for *approximate* equality. `as.numeric(x)==0.1`

is `TRUE`

, as is `all.equal(as.numeric(x),0.1)`

. You can adjust the tolerance of `all.equal()`

:

```
z1 <- 0.1
z2 <- z1 + 1e-14
all.equal(z1,z2) ## TRUE
all.equal(z1,z2,tolerance=1e-15)
## [1] "Mean relative difference: 1.000589e-13"
isTRUE(all.equal(z1,z2,tolerance=1e-15)) ## FALSE
```

Answered By - Ben Bolker Answer Checked By - Cary Denson (PHPFixing Admin)

## 0 Comments:

## Post a Comment

Note: Only a member of this blog may post a comment.