[R] Why does the print method fail for very small numbers?

Marius Hofert m@r|u@@ho|ert @end|ng |rom uw@ter|oo@c@
Thu Feb 17 23:40:09 CET 2022


Dear expeRts,

I'm familiar with IEEE 754. Is there an easy way to explain why even
just printing of small numbers fails?

1e-317 # 1e-317 => fine
1e-318 # 9.999987e-319 => gets tricky; seems to call print() => as.character() => format() => paste()
1e-318 == 9.999987e-319 # TRUE
2.48e-324 # prints 4.940656e-324 for me
2.48e-324 == 4.940656e-324 # TRUE
## Relative error as a plot
rel_error <- function(x)
    plot(abs((as.numeric(as.character(x)) - x) / x), type = "l",
         ylab = "Relative error between x and as.numeric(as.character(x))")
rel_error(seq(0.001, 0.001 + .Machine$double.xmin, length.out = 1001)) # fine
rel_error(seq(0, .Machine$double.xmin, length.out = 1001)) # printing breaks down

Of course, [0,.Machine$double.xmin] is somewhat of a strange set of numbers to consider,
and I expect things like "==" to be easily fooled there, but already the print method (?)

Thanks & cheers,
Marius

sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-apple-darwin21.2.0 (64-bit)
Running under: macOS Monterey 12.1
...




More information about the R-help mailing list