factor/extra/math/continued-fractions/continued-fractions.factor

27 lines
641 B
Factor

! Copyright (C) 2009 Samuel Tardieu.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.functions sequences vectors ;
IN: math.continued-fractions
<PRIVATE
: split-float ( f -- d i )
dup >integer [ - ] keep ;
: closest ( seq -- newseq )
unclip-last round >integer suffix ;
PRIVATE>
: next-approx ( seq -- )
dup [ pop split-float ] [ push ] bi
[ drop ] [ recip swap push ] if-zero ;
: >ratio ( seq -- a/b )
closest reverse! unclip-slice [ swap recip + ] reduce ;
: approx ( epsilon float -- a/b )
dup 1vector
[ 3dup >ratio - abs < ] [ dup next-approx ] while
2nip >ratio ;