2005-02-08 22:02:44 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
2006-01-12 00:34:56 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2004-07-16 02:26:21 -04:00
|
|
|
IN: math
|
2005-04-21 00:49:19 -04:00
|
|
|
USING: errors kernel math math-internals ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2005-08-12 18:02:03 -04:00
|
|
|
: exp >rect swap fexp swap polar> ; inline
|
|
|
|
: log >polar swap flog swap rect> ; inline
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2005-09-16 22:47:28 -04:00
|
|
|
GENERIC: sqrt ( n -- n ) foldable
|
|
|
|
|
|
|
|
M: complex sqrt >polar swap fsqrt swap 2 / polar> ;
|
2005-09-24 15:21:17 -04:00
|
|
|
M: real sqrt dup 0 < [ neg fsqrt 0 swap rect> ] [ fsqrt ] if ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2005-08-12 18:02:03 -04:00
|
|
|
GENERIC: ^ ( z w -- z^w ) foldable
|
2005-04-21 00:49:19 -04:00
|
|
|
|
2004-07-16 02:26:21 -04:00
|
|
|
: ^mag ( w abs arg -- magnitude )
|
2005-08-12 18:02:03 -04:00
|
|
|
>r >r >rect swap r> swap fpow r> rot * fexp / ; inline
|
2004-07-16 02:26:21 -04:00
|
|
|
|
|
|
|
: ^theta ( w abs arg -- theta )
|
2005-08-12 18:02:03 -04:00
|
|
|
>r >r >rect r> flog * swap r> * + ; inline
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2006-01-28 13:43:42 -05:00
|
|
|
: 0^ ( z w -- )
|
2006-01-28 15:49:31 -05:00
|
|
|
dup zero? [
|
2006-01-28 13:43:42 -05:00
|
|
|
2drop 0.0/0.0
|
|
|
|
] [
|
|
|
|
0 < [ drop 1.0/0.0 ] when
|
|
|
|
] if ;
|
|
|
|
|
2005-04-21 00:49:19 -04:00
|
|
|
M: number ^ ( z w -- z^w )
|
2006-01-28 15:49:31 -05:00
|
|
|
over zero?
|
2006-01-28 13:43:42 -05:00
|
|
|
[ 0^ ] [ swap >polar 3dup ^theta >r ^mag r> polar> ] if ;
|
2005-04-21 00:49:19 -04:00
|
|
|
|
|
|
|
: each-bit ( n quot -- | quot: 0/1 -- )
|
2006-01-28 15:49:31 -05:00
|
|
|
over zero? pick -1 number= or [
|
2005-04-21 00:49:19 -04:00
|
|
|
2drop
|
|
|
|
] [
|
|
|
|
2dup >r >r >r 1 bitand r> call r> -1 shift r> each-bit
|
2005-09-24 15:21:17 -04:00
|
|
|
] if ; inline
|
2005-04-21 00:49:19 -04:00
|
|
|
|
|
|
|
: (integer^) ( z w -- z^w )
|
|
|
|
1 swap [ 1 number= [ dupd * ] when >r sq r> ] each-bit nip ;
|
2005-08-12 18:02:03 -04:00
|
|
|
inline
|
2005-04-21 00:49:19 -04:00
|
|
|
|
|
|
|
M: integer ^ ( z w -- z^w )
|
2006-01-28 15:49:31 -05:00
|
|
|
over zero?
|
2006-01-28 13:43:42 -05:00
|
|
|
[ 0^ ] [ dup 0 < [ neg ^ recip ] [ (integer^) ] if ] if ;
|
2006-01-09 01:34:23 -05:00
|
|
|
|
|
|
|
: power-of-2? ( n -- ? )
|
|
|
|
dup 0 > [
|
|
|
|
dup dup neg bitand =
|
|
|
|
] [
|
|
|
|
drop f
|
|
|
|
] if ; foldable
|
|
|
|
|
|
|
|
: log2 ( n -- b )
|
|
|
|
{
|
|
|
|
{ [ dup 0 <= ] [ "Input must be positive" throw ] }
|
|
|
|
{ [ dup 1 = ] [ drop 0 ] }
|
|
|
|
{ [ t ] [ -1 shift log2 1+ ] }
|
|
|
|
} cond ; foldable
|