[R] A very small p-value
    Christophe Dutang 
    dut@ngc @end|ng |rom gm@||@com
       
    Sat Oct 25 22:37:57 CEST 2025
    
    
  
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)
    
    
More information about the R-help
mailing list