[R] A very small p-value
Spencer Graves
@pencer@gr@ve@ @end|ng |rom e||ect|vede|en@e@org
Sun Oct 26 16:15:38 CET 2025
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 <dutangc using gmail.com> 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 <ikrylov using disroot.org> a écrit :
>>>
>>> В Sat, 25 Oct 2025 11:45:42 +0200
>>> Christophe Dutang <dutangc using gmail.com> пишет:
>>>
>>>> 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)
>>
>> ______________________________________________
>> 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 https://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> 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 https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list