The answer to pnorm(-x, log.p=TRUE) is of course about -0.5*x*x for large x. So trying to compute it for -1e108 is a bit silly, both on your part and the C code used. I've altered the C code not to attempt it for x > 1e170, which excludes the area where underflow occurs.

On Fri, 14 May 2010, [email protected] wrote:

On 13-May-10 20:04:50, [email protected] 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) <[email protected]>
Fax-to-email: +44 (0)870 094 0861
Date: 14-May-10                                       Time: 00:01:27
------------------------------ XFMail ------------------------------

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


--
Brian D. Ripley,                  [email protected]
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to