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.

Reply via email to