2005-02-08 22:02:44 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-02-20 19:03:37 -05:00
|
|
|
IN: math
|
|
|
|
BUILTIN: fixnum 0 ;
|
|
|
|
BUILTIN: bignum 1 ;
|
|
|
|
UNION: integer fixnum bignum ;
|
2004-12-24 02:52:02 -05:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
IN: math-internals
|
2005-02-20 19:03:37 -05:00
|
|
|
USING: errors generic kernel math ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-12-24 02:52:02 -05:00
|
|
|
: fraction> ( a b -- a/b )
|
2004-12-30 02:40:14 -05:00
|
|
|
dup 1 number= [
|
|
|
|
drop
|
2004-12-24 02:52:02 -05:00
|
|
|
] [
|
2004-12-30 02:40:14 -05:00
|
|
|
(fraction>)
|
2005-02-24 20:52:17 -05:00
|
|
|
] ifte ;
|
2004-12-24 02:52:02 -05:00
|
|
|
|
2004-12-30 20:46:20 -05:00
|
|
|
: division-by-zero ( x y -- )
|
|
|
|
"Division by zero" throw drop ;
|
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
: integer/ ( x y -- x/y )
|
2004-12-30 02:40:14 -05:00
|
|
|
dup 0 number= [
|
2004-12-30 20:46:20 -05:00
|
|
|
division-by-zero
|
2004-12-30 02:40:14 -05:00
|
|
|
] [
|
|
|
|
dup 0 < [
|
|
|
|
swap neg swap neg
|
|
|
|
] when
|
|
|
|
2dup gcd tuck /i >r /i r> fraction>
|
2004-12-30 20:46:20 -05:00
|
|
|
] ifte ; inline
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2005-03-20 19:05:57 -05:00
|
|
|
M: fixnum number=
|
|
|
|
#! Fixnums are immediate values, so equality testing is
|
|
|
|
#! trivial.
|
|
|
|
eq? ;
|
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: fixnum < fixnum< ;
|
|
|
|
M: fixnum <= fixnum<= ;
|
|
|
|
M: fixnum > fixnum> ;
|
|
|
|
M: fixnum >= fixnum>= ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: fixnum + fixnum+ ;
|
|
|
|
M: fixnum - fixnum- ;
|
|
|
|
M: fixnum * fixnum* ;
|
|
|
|
M: fixnum / integer/ ;
|
|
|
|
M: fixnum /i fixnum/i ;
|
|
|
|
M: fixnum /f fixnum/f ;
|
|
|
|
M: fixnum mod fixnum-mod ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: fixnum /mod fixnum/mod ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: fixnum bitand fixnum-bitand ;
|
|
|
|
M: fixnum bitor fixnum-bitor ;
|
|
|
|
M: fixnum bitxor fixnum-bitxor ;
|
|
|
|
M: fixnum shift fixnum-shift ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: fixnum bitnot fixnum-bitnot ;
|
2004-11-08 22:36:51 -05:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: bignum number= bignum= ;
|
|
|
|
M: bignum < bignum< ;
|
|
|
|
M: bignum <= bignum<= ;
|
|
|
|
M: bignum > bignum> ;
|
|
|
|
M: bignum >= bignum>= ;
|
2004-11-08 22:36:51 -05:00
|
|
|
|
2004-12-18 23:18:32 -05:00
|
|
|
M: bignum + bignum+ ;
|
|
|
|
M: bignum - bignum- ;
|
|
|
|
M: bignum * bignum* ;
|
|
|
|
M: bignum / integer/ ;
|
|
|
|
M: bignum /i bignum/i ;
|
|
|
|
M: bignum /f bignum/f ;
|
|
|
|
M: bignum mod bignum-mod ;
|
|
|
|
|
|
|
|
M: bignum /mod bignum/mod ;
|
|
|
|
|
|
|
|
M: bignum bitand bignum-bitand ;
|
|
|
|
M: bignum bitor bignum-bitor ;
|
|
|
|
M: bignum bitxor bignum-bitxor ;
|
|
|
|
M: bignum shift bignum-shift ;
|
|
|
|
|
|
|
|
M: bignum bitnot bignum-bitnot ;
|