One possible source of confusion is that the `print.Coefmat` function uses .Machine$double.eps as its threshold for printing "< [minimum value]" rather than the precise computed p-value (presumably on the grounds that a number smaller than this is likely to be unrealistic as an accurate statement of the unlikeliness of an outcome in the real world). On 10/26/25 10: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 at 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 at disroot.org> a ?crit : >>> >>> ? Sat, 25 Oct 2025 11:45:42 +0200 >>> Christophe Dutang <dutangc at 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 at 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 at 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.-- Dr. Benjamin Bolker Professor, Mathematics & Statistics and Biology, McMaster University Associate chair (graduate), Mathematics & Statistics Director, School of Computational Science and Engineering * E-mail is sent at my convenience; I don't expect replies outside of working hours.
In my own experience, teeny tiny p-values were either markers of already well known stuff or of errors somewhere -- often my own typos, etc. That is, they never indicated anything of real scientific interest. Of course, YMMV. ? -- Bert On Sun, Oct 26, 2025 at 3:34?PM Ben Bolker <bbolker at gmail.com> wrote:> One possible source of confusion is that the `print.Coefmat` function > uses .Machine$double.eps as its threshold for printing "< [minimum > value]" rather than the precise computed p-value (presumably on the > grounds that a number smaller than this is likely to be unrealistic as > an accurate statement of the unlikeliness of an outcome in the real world). > > On 10/26/25 10: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 at 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 at disroot.org> a ?crit : > >>> > >>> ? Sat, 25 Oct 2025 11:45:42 +0200 > >>> Christophe Dutang <dutangc at 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 at 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 at 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. > > -- > Dr. Benjamin Bolker > Professor, Mathematics & Statistics and Biology, McMaster University > Associate chair (graduate), Mathematics & Statistics > Director, School of Computational Science and Engineering > * E-mail is sent at my convenience; I don't expect replies outside of > working hours. > > ______________________________________________ > R-help at 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. >[[alternative HTML version deleted]]
I suspect this is more like a relic from times when people would do (say) 1 - pchisq(x,f) instead of pchisq(x, f, lower=FALSE) and intended to avoid the embarrassment of printing 0 for things that weren?t actually impossible. People have been known to have unexpected uses for the tiny probabilities (one case came from theoretical physics - I think it got recorded as a fortune() entry) but rarely as low as 10^-16 in actual significance testing. Things like whole genome scans may suggest some hefty Bonferroni multipliers, but the numer of tests are not (yet?) in the trillions (US). - pd> On 26 Oct 2025, at 23.34, Ben Bolker <bbolker at gmail.com> wrote: > > One possible source of confusion is that the `print.Coefmat` function uses .Machine$double.eps as its threshold for printing "< [minimum value]" rather than the precise computed p-value (presumably on the grounds that a number smaller than this is likely to be unrealistic as an accurate statement of the unlikeliness of an outcome in the real world). > > On 10/26/25 10: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 at 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 at disroot.org> a ?crit : >>>> >>>> ? Sat, 25 Oct 2025 11:45:42 +0200 >>>> Christophe Dutang <dutangc at 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 at 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 at 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. > > -- > Dr. Benjamin Bolker > Professor, Mathematics & Statistics and Biology, McMaster University > Associate chair (graduate), Mathematics & Statistics > Director, School of Computational Science and Engineering > * E-mail is sent at my convenience; I don't expect replies outside of working hours. > > ______________________________________________ > R-help at 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.