factor/library/math/pow.factor

61 lines
1.5 KiB
Factor
Raw Normal View History

! 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
USING: errors kernel math math-internals ;
2004-07-16 02:26:21 -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
GENERIC: ^ ( z w -- z^w ) foldable
2004-07-16 02:26:21 -04:00
: ^mag ( w abs arg -- magnitude )
>r >r >rect swap r> swap fpow r> rot * fexp / ; inline
2004-07-16 02:26:21 -04:00
: ^theta ( w abs arg -- theta )
>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 ;
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 ;
: each-bit ( n quot -- | quot: 0/1 -- )
2006-01-28 15:49:31 -05:00
over zero? pick -1 number= or [
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
: (integer^) ( z w -- z^w )
1 swap [ 1 number= [ dupd * ] when >r sq r> ] each-bit nip ;
inline
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