factor/core/math/ratios/ratios.factor

79 lines
1.9 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2015-07-30 12:41:58 -04:00
USING: accessors kernel math ;
IN: math.ratios
: 2fraction>parts ( a/b c/d -- a c b d )
[ fraction>parts ] bi@ swapd ; inline
<PRIVATE
2007-09-20 18:09:08 -04:00
: parts>fraction ( a b -- a/b )
dup 1 number= [ drop ] [ ratio boa ] if ; inline
2007-09-20 18:09:08 -04:00
: (scale) ( a b c d -- a*d b*c )
[ * swap ] dip * swap ; inline
: scale ( a/b c/d -- a*d b*c )
2fraction>parts (scale) ; inline
: scale+d ( a/b c/d -- a*d b*c b*d )
2fraction>parts [ (scale) ] 2keep * ; inline
PRIVATE>
ERROR: division-by-zero x ;
2009-08-11 19:15:53 -04:00
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
2dup simple-gcd [ /i ] curry bi@ parts>fraction
2009-08-11 19:15:53 -04:00
] if-zero ;
2007-09-20 18:09:08 -04:00
M: integer recip
1 swap [
division-by-zero
] [
dup 0 < [ [ neg ] bi@ ] when parts>fraction
] if-zero ;
M: ratio recip
fraction>parts swap dup 0 < [ [ neg ] bi@ ] when parts>fraction ;
2008-09-02 03:02:05 -04:00
M: ratio hashcode*
nip fraction>parts [ hashcode ] bi@ bitxor ;
2008-09-02 03:02:05 -04:00
M: ratio equal?
over ratio? [
2fraction>parts = [ = ] [ 2drop f ] if
2008-09-02 03:02:05 -04:00
] [ 2drop f ] if ;
2007-09-20 18:09:08 -04:00
M: ratio number=
2fraction>parts number= [ number= ] [ 2drop f ] if ;
2007-09-20 18:09:08 -04:00
M: ratio >fixnum fraction>parts /i >fixnum ;
M: ratio >bignum fraction>parts /i >bignum ;
M: ratio >float fraction>parts /f ;
2007-09-20 18:09:08 -04:00
M: ratio numerator numerator>> ; inline
M: ratio denominator denominator>> ; inline
M: ratio fraction>parts [ numerator ] [ denominator ] bi ; inline
2007-09-20 18:09:08 -04:00
M: ratio < scale < ;
M: ratio <= scale <= ;
M: ratio > scale > ;
M: ratio >= scale >= ;
M: ratio + scale+d [ + ] [ / ] bi* ;
M: ratio - scale+d [ - ] [ / ] bi* ;
M: ratio * 2fraction>parts [ * ] 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* ;
M: ratio abs dup neg? [ fraction>parts [ neg ] dip parts>fraction ] when ;
M: ratio neg? numerator neg? ; inline