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.

______________________________________________
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