I should have remembered MASS::fractions(). This has a slightly different aim, giving continued fraction approximations to any real number, where my function just tries to handle numbers that really are close to fractions with small denominators.
For example, unfrac() won't report a fraction for sqrt(2), even with tol=0.1, max=10000, since sqrt(2), which doesn't have very good rational approximations (algebraic numbers tend not to). -thomas On Thu, 13 Sep 2007, Ravi Varadhan wrote: > Finding sufficiently accurate rational approximations to a real number, can > be done using fractions() in MASS, which uses continued fractions. > "Sufficient" accuracy can be specified using the number of cycles and > maximum denominator size options (note that max.denom is the final term in > the continued fraction). > > Some examples: >> library(MASS) >> fractions(0.333333,max.denom=100000) > [1] 1/3 >> fractions(0.333333,max.denom=1000000) > [1] 1519169814041/4557513999637 >> fractions(0.333333,max.denom=1000000,cycles=11) > [1] 8587703744937/25763136997948 > >> fractions(pi,max=1) > [1] 3 >> fractions(pi,max=10) > [1] 22/7 >> fractions(pi,max=100) > [1] 355/113 >> fractions(pi,max=1000) > [1] 4272943/1360120 >> fractions(pi,max=1000,cycles=12) > [1] 80143857/25510582 > This last rational approximation to pi is quite accurate, up to machine > precision (i.e. 16 digits) > > Ravi. > > ---------------------------------------------------------------------------- > ------- > > Ravi Varadhan, Ph.D. > > Assistant Professor, The Center on Aging and Health > > Division of Geriatric Medicine and Gerontology > > Johns Hopkins University > > Ph: (410) 502-2619 > > Fax: (410) 614-9625 > > Email: [EMAIL PROTECTED] > > Webpage: http://www.jhsph.edu/agingandhealth/People/Faculty/Varadhan.html > > > > ---------------------------------------------------------------------------- > -------- > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On > Behalf Of Thomas Lumley > Sent: Thursday, September 13, 2007 11:34 AM > To: Mauro Arnoldi > Cc: r-help@r-project.org > Subject: Re: [R] Number -> Fraction > > On Thu, 13 Sep 2007, Mauro Arnoldi wrote: > >> Hi everybody! >> I'm new to this list and also to the R program. >> >> I'd like to know if there is a function able to convert results into >> Fractional form like my scientific calculator have. For example: >> >>> 1/3 >> [1] 0.3333333 >> >>> function_that_return_a_fraction_from_numbers(0.3333333) >> [1] 1/3 >> > > This must have some restrictions (so it doesn't return 3333333/1000000, > which would be a more accurate fraction). > > One approach is >> unfrac <- function(x, max=100, tol=0.01){ > num <- x * (1:max) > err <- (num - round(num)) * (1:max) > if (!any(abs(err) < tol)) > return(NA) > i <- which.min(abs(err)) > c(round(num[i]), i) > } > > This returns the best fraction approximation with denominator up to `max`, > where `best` is in terms of the non-integer part of the numerator, and no > answer is given if the non-integer part of the numerator is more than > `tol` > >> unfrac(0.3333333) > [1] 1 3 >> unfrac(pi) > [1] NA >> unfrac(pi,max=1000) > [1] 355 113 >> unfrac(pi,tol=0.1) > [1] 22 7 > > -thomas > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > Thomas Lumley Assoc. Professor, Biostatistics [EMAIL PROTECTED] University of Washington, Seattle ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.