[gambit-list] Any rational-number->string with infinite precision for decimal output? (i.e. d.ddddd rather than x/y)

Hendrik Boom hendrik at topoi.pooq.com
Thu Jan 16 08:35:51 EST 2014


On Thu, Jan 16, 2014 at 07:34:41AM -0500, Marc Feeley wrote:
> 
> On Jan 16, 2014, at 4:59 AM, Estevo <euccastro at gmail.com> wrote:
> 
> The algorithm I gave produces the decimal representation such that the repeating part if there is one is identified.  A simple change to the algorithm will return a boolean indicating if there is a repeating part or not (i.e. if the digit generator encounters a cycle).
> 
> Marc
> 
> 
> (define (has-finite-decimal-representation? n) ;; n is a positive real
> 
>   (define (generator frac states)
>     (if (= frac 0)
>         #t
>         (let ((seen (member frac states)))
>           (if seen
>               #f
>               (let* ((frac*10 (* 10 frac))
>                      (digit (truncate frac*10)))
>                 (generator (- frac*10 digit)
>                            (cons frac states)))))))
> 
>   (let* ((exact (inexact->exact n))
>          (int (truncate exact)))
>     (generator (- exact int) '())))
> 
> (pp (has-finite-decimal-representation? 1/1024))
> (pp (has-finite-decimal-representation? 1/999))
> (pp (has-finite-decimal-representation? 5/700))
> (pp (has-finite-decimal-representation? 0.1))
> (pp (has-finite-decimal-representation? 0.2))
> (pp (has-finite-decimal-representation? 0.3))
> (pp (has-finite-decimal-representation? (* 4 (atan 1))))
> (pp (has-finite-decimal-representation? (expt 1/3 7)))
> 
> ;; output:
> ;;
> ;; #t
> ;; #f
> ;; #f
> ;; #t
> ;; #t
> ;; #t
> ;; #t
> ;; #f
> 

If all you want is a boolean, maybe it would be simpler to reduce the 
fraction to lowest terms (might this already have been done?) and then 
checking if the denominator is divisible by 2 or 5.

-- hendrik



More information about the Gambit-list mailing list