Re: A very small p-value

Spencer Graves <[email protected]>
Newsgroups gmane.comp.lang.r.general
Message-ID <[email protected]>
Similarly,


 > .Machine$double.xmin
[1] 2.225074e-308


is NOT really the smallest number currently available on my computer, 
but it's moderately close, e.g.,


 > .Machine$double.xmin/2
[1] 1.112537e-308
 > .Machine$double.xmin^1.1
[1] 0


To maximize likelihood, I routinely use log or log.p = TRUE in functions 
like dt and pt, because nonlinear optimization too often throws and 
error with a likelihood of 0, whose logarithm is -Inf but does not have 
a problem on a log scale:


 > log(.Machine$double.xmin)
[1] -708.3964
 > log(.Machine$double.xmin)*2
[1] -1416.793


Spencer Graves


On 10/26/25 09:41, Richard O'Keefe wrote:
> No, 0 and 5-19 are not "equalled".  THey are quite distinct.
> As for pt() returning something smaller than double.eps, why wouldn't it?
> If I calculate 10^-30, I get 1e-30, which is much smaller than  double.eps,
> but is still correct.  It would be a serious error to return 0 for 10^-30.
> Welcome to the wonderful world of floating-point arithmetic.
> This really has nothing to do with R.
> 
> On Sun, 26 Oct 2025 at 09:38, Christophe Dutang <[email protected]> wrote:
>>
>> Thanks for your answers.
>>
>> I was not aware of the R function expm1().
>>
>> I’m completely aware that 1 == 1 - 5e-19. But I was wondering why pt() returns something smaller than double.eps.
>>
>> For students who will use this exercise, it is disturbing to find 0 or 5e-19 : yet it will be a good exercise to find that these quantities are equalled.
>>
>> Regards, Christophe
>>
>>> Le 25 oct. 2025 à 12:14, Ivan Krylov <[email protected]> a écrit :
>>>
>>> В Sat, 25 Oct 2025 11:45:42 +0200
>>> Christophe Dutang <[email protected]> пишет:
>>>
>>>> Indeed, the p-value is lower than the epsilon machine
>>>>
>>>>> pt(t_score, df = n-2, lower=FALSE) < .Machine$double.eps
>>>> [1] TRUE
>>>
>>> Which means that for lower=TRUE, there will not be enough digits in R's
>>> numeric() type to represent the 5*10^-19 subtracted from 1 and
>>> approximately 16 zeroes.
>>>
>>> Instead, you can verify your answer by asking for the logarithm of the
>>> number that is too close to 1, thus retaining more significant digits:
>>>
>>> print(
>>> -expm1(pt(t_score, df = n-2, lower=TRUE, log.p = TRUE)),
>>> digits=16
>>> )
>>> # [1] 2.539746620181249e-19
>>> print(pt(t_score, df = n-2, lower=FALSE), digits=16)
>>> # [1] 2.539746620181248e-19
>>>
>>> expm1(.) computes exp(.)-1 while retaining precision for numbers that
>>> are too close to 0, for which exp() would otherwise return 1.
>>>
>>> See the links in
>>> https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f
>>> for a more detailed explanation.
>>>
>>> --
>>> Best regards,
>>> Ivan
>>> (flipping the "days since referring to R FAQ 7.31" sign back to 0)
>>
>> ______________________________________________
>> [email protected] mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> [email protected] mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.