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

Richard O'Keefe r@oknz @end|ng |rom gm@||@com
Sat Feb 19 10:54:13 CET 2022


You say that you already understand IEEE floating point
arithmetic, but you have placed the problem at the wrong
end.  The problem is at the INPUT end.  The smallest
number that can be represented in IEEE double format
is 4.940656458412465d-324
but you asked for 2.48e-324.
The two representable numbers closest to that are
+0.0 and 4.94...e-324.  Of those, 4.94...e-324 is
a little bit closer.  So 4.94...e-324 was THE BEST
ANSWER YOU COULD POSSIBLY GET.

The number having been rounded up to the nearest
representable number, that representable number was
printed pretty darned well.  So:
- you have NOT found an error in printing
- you have NOT found an error in comparison
- you HAVE found that rounding in the range of
  denormalised numbers is pretty harsh.

One more time: the print function DID NOT FAIL
for tiny numbers.  It printed what you gave it
and printed it well.  The problem was at the
INPUT end.

On Fri, 18 Feb 2022 at 11:41, Marius Hofert <marius.hofert using uwaterloo.ca>
wrote:

> 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
> ...
>
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list