1 ! Copyright (C) 2004, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: kernel kernel.private math math.functions math.private ;
6 : >fraction ( a/b -- a b )
7 dup numerator swap denominator ; inline
9 : 2>fraction ( a/b c/d -- a c b d )
10 [ >fraction ] bi@ swapd ; inline
14 : fraction> ( a b -- a/b )
15 dup 1 number= [ drop ] [ <ratio> ] if ; inline
17 : scale ( a/b c/d -- a*d b*c )
18 2>fraction >r * swap r> * swap ; inline
20 : ratio+d ( a/b c/d -- b*d )
21 denominator swap denominator * ; inline
27 "Division by zero" throw
29 dup 0 < [ [ neg ] bi@ ] when
30 2dup gcd nip tuck /i >r /i r> fraction>
34 2>fraction number= [ number= ] [ 2drop f ] if ;
36 M: ratio >fixnum >fraction /i >fixnum ;
37 M: ratio >bignum >fraction /i >bignum ;
38 M: ratio >float >fraction /f ;
41 M: ratio <= scale <= ;
43 M: ratio >= scale >= ;
45 M: ratio + 2dup scale + -rot ratio+d / ;
46 M: ratio - 2dup scale - -rot ratio+d / ;
47 M: ratio * 2>fraction * >r * r> / ;
49 M: ratio /i scale /i ;
50 M: ratio /f scale /f ;
51 M: ratio mod 2dup >r >r /i r> r> rot * - ;
52 M: ratio /mod [ /i ] 2keep mod ;