2008-06-28 03:36:20 -04:00
|
|
|
! Copyright (C) 2004, 2008 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-08-11 19:15:53 -04:00
|
|
|
USING: accessors kernel kernel.private math math.functions
|
|
|
|
math.private sequences summary ;
|
2007-10-14 20:38:23 -04:00
|
|
|
IN: math.ratios
|
|
|
|
|
|
|
|
: 2>fraction ( a/b c/d -- a c b d )
|
2008-03-29 21:36:58 -04:00
|
|
|
[ >fraction ] bi@ swapd ; inline
|
2007-10-14 20:38:23 -04:00
|
|
|
|
|
|
|
<PRIVATE
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: fraction> ( a b -- a/b )
|
2009-04-30 01:27:35 -04:00
|
|
|
dup 1 number= [ drop ] [ ratio boa ] if ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2012-09-10 22:53:25 -04:00
|
|
|
: (scale) ( a b c d -- a*d b*c )
|
|
|
|
[ * swap ] dip * swap ; inline
|
|
|
|
|
2007-10-14 20:38:23 -04:00
|
|
|
: scale ( a/b c/d -- a*d b*c )
|
2012-09-10 22:53:25 -04:00
|
|
|
2>fraction (scale) ; inline
|
2007-10-14 20:38:23 -04:00
|
|
|
|
2012-09-10 22:53:25 -04:00
|
|
|
: scale+d ( a/b c/d -- a*d b*c b*d )
|
|
|
|
2>fraction [ (scale) ] 2keep * ; inline
|
2007-10-14 20:38:23 -04:00
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2009-08-11 23:30:16 -04:00
|
|
|
ERROR: division-by-zero x ;
|
2009-08-11 19:15:53 -04:00
|
|
|
|
|
|
|
M: division-by-zero summary
|
|
|
|
drop "Division by zero" ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
M: integer /
|
2009-08-11 19:15:53 -04:00
|
|
|
[
|
|
|
|
division-by-zero
|
2007-09-20 18:09:08 -04:00
|
|
|
] [
|
2008-03-29 21:36:58 -04:00
|
|
|
dup 0 < [ [ neg ] bi@ ] when
|
2012-04-05 12:17:52 -04:00
|
|
|
2dup fast-gcd [ /i ] curry bi@ fraction>
|
2009-08-11 19:15:53 -04:00
|
|
|
] if-zero ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2012-09-02 12:47:31 -04:00
|
|
|
M: integer recip
|
|
|
|
1 swap [
|
|
|
|
division-by-zero
|
|
|
|
] [
|
|
|
|
dup 0 < [ [ neg ] bi@ ] when fraction>
|
|
|
|
] if-zero ;
|
|
|
|
|
|
|
|
M: ratio recip
|
2012-09-02 13:08:00 -04:00
|
|
|
>fraction swap dup 0 < [ [ neg ] bi@ ] when fraction> ;
|
2012-09-02 12:47:31 -04:00
|
|
|
|
2008-09-02 03:02:05 -04:00
|
|
|
M: ratio hashcode*
|
|
|
|
nip >fraction [ hashcode ] bi@ bitxor ;
|
|
|
|
|
|
|
|
M: ratio equal?
|
|
|
|
over ratio? [
|
|
|
|
2>fraction = [ = ] [ 2drop f ] if
|
|
|
|
] [ 2drop f ] if ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
M: ratio number=
|
|
|
|
2>fraction number= [ number= ] [ 2drop f ] if ;
|
|
|
|
|
|
|
|
M: ratio >fixnum >fraction /i >fixnum ;
|
|
|
|
M: ratio >bignum >fraction /i >bignum ;
|
|
|
|
M: ratio >float >fraction /f ;
|
|
|
|
|
2009-08-17 23:32:21 -04:00
|
|
|
M: ratio numerator numerator>> ; inline
|
|
|
|
M: ratio denominator denominator>> ; inline
|
2008-06-28 03:36:20 -04:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
M: ratio < scale < ;
|
|
|
|
M: ratio <= scale <= ;
|
|
|
|
M: ratio > scale > ;
|
|
|
|
M: ratio >= scale >= ;
|
|
|
|
|
2012-09-10 22:53:25 -04:00
|
|
|
M: ratio + scale+d [ + ] [ / ] bi* ;
|
|
|
|
M: ratio - scale+d [ - ] [ / ] bi* ;
|
2008-12-22 06:41:01 -05:00
|
|
|
M: ratio * 2>fraction [ * ] 2bi@ / ;
|
2007-09-20 18:09:08 -04:00
|
|
|
M: ratio / scale / ;
|
|
|
|
M: ratio /i scale /i ;
|
2008-04-28 22:26:31 -04:00
|
|
|
M: ratio /f scale /f ;
|
2013-03-28 18:00:21 -04:00
|
|
|
M: ratio mod scale+d [ mod ] [ / ] bi* ;
|
2013-03-28 17:56:47 -04:00
|
|
|
M: ratio /mod scale+d [ /mod ] [ / ] bi* ;
|
2014-06-05 13:53:02 -04:00
|
|
|
M: ratio abs dup neg? [ >fraction [ neg ] dip fraction> ] when ;
|
|
|
|
M: ratio neg? numerator neg? ; inline
|