[Rd] results of pnorm as either NaN or Inf

(Ted Harding) Ted.Harding at manchester.ac.uk
Fri May 14 01:01:31 CEST 2010


On 13-May-10 20:04:50, efreeman at berkeley.edu wrote:
> I stumbled across this and I am wondering if this is unexpected
> behavior or if I am missing something.
> 
>> pnorm(-1.0e+307, log.p=TRUE)
> [1] -Inf
>> pnorm(-1.0e+308, log.p=TRUE)
> [1] NaN
> Warning message:
> In pnorm(q, mean, sd, lower.tail, log.p) : NaNs produced
>> pnorm(-1.0e+309, log.p=TRUE)
> [1] -Inf
> 
> I don't know C and am not that skilled with R, so it would be hard
> for me to look into the code for pnorm. If I'm not just missing
> something, I thought it may be of interest.
> 
> Details:
> I am using Mac OS X 10.5.8. I installed a precompiled binary version.
> Here is the output from sessionInfo(), requested in the posting guide:
> R version 2.11.0 (2010-04-22) 
> i386-apple-darwin9.8.0 
> 
> locale:
> [1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8
> 
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base   
> 
> loaded via a namespace (and not attached):
> [1] tools_2.11.0
> 
> Thank you very much,
> 
> Eric Freeman
> UC Berkeley

This is probably platform-independent. I get the same results with
R on Linux. More to the point:

You are clearly "pushing the envelope" here. First, have a look
at what R makes of your inputs to pnorm():

  -1.0e+307
  # [1] -1e+307
  -1.0e+308
  # [1] -1e+308
  -1.0e+309
  # [1] -Inf


So, somewhere beteen -1e+308 and -1.0e+309. the envelope burst!
Given -1.0e+309, R returns -Inf (i.e. R can no longer represent
this internally as a finite number).

Now look at

  pnorm(-Inf,log.p=TRUE)
  # [1] -Inf

So, R knows how to give the correct answer (an exact 0, or -Inf
on the log scale) if you feed pnorm() with -Inf. So you're OK
with -1e+N where N >= 309.

For smaller powers, e.g. -1e+(200:306), these give pnorm() much
less than -1.0e+309, and presumably R's algorithm (which I haven't
studied either ... ) returns 0 for pnorm(), as it should to the
available internal accuracy.

So, up to pnorm(-1.0e+307, log.p=TRUE) = -Inf. All is as it should be.
However, at -1e+308, "the envelope is about to burst", and something
may occur within the algorithm which results in a NaN.

So there is nothing anomalous about your results except at -1e+308,
which is where R is at a critical point.

That's how I see it, anway!
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 14-May-10                                       Time: 00:01:27
------------------------------ XFMail ------------------------------



More information about the R-devel mailing list