| 
									
										
										
										
											2013-03-27 17:47:46 -04:00
										 |  |  | ! Copyright (C) 2009 Joe Groff, 2013 John Benediktsson | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-04-14 00:21:28 -04:00
										 |  |  | USING: accessors byte-arrays combinators kernel kernel.private | 
					
						
							| 
									
										
										
										
											2013-03-28 14:55:52 -04:00
										 |  |  | layouts make math math.private namespaces sbufs sequences | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  | sequences.private splitting strings strings.private ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: math.parser | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-25 21:02:03 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | PRIMITIVE: (format-float) ( n format -- byte-array )
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : digit> ( ch -- n )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-07 16:04:20 -05:00
										 |  |  |         { [ dup CHAR: 9 <= ] [ CHAR: 0 -      dup  0 < [ drop 255 ] when ] } | 
					
						
							|  |  |  |         { [ dup CHAR: a <  ] [ CHAR: A 10 - - dup 10 < [ drop 255 ] when ] } | 
					
						
							|  |  |  |                              [ CHAR: a 10 - - dup 10 < [ drop 255 ] when ] | 
					
						
							|  |  |  |     } cond ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 21:06:51 -04:00
										 |  |  | : string>digits ( str -- digits )
 | 
					
						
							|  |  |  |     [ digit> ] B{ } map-as ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : >digit ( n -- ch )
 | 
					
						
							|  |  |  |     dup 10 < [ CHAR: 0 + ] [ 10 - CHAR: a + ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-06 18:12:33 -04:00
										 |  |  | ERROR: invalid-radix radix ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-08 10:32:01 -04:00
										 |  |  | TUPLE: number-parse | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { str read-only } | 
					
						
							|  |  |  |     { length fixnum read-only } | 
					
						
							| 
									
										
										
										
											2015-07-19 12:56:39 -04:00
										 |  |  |     { radix fixnum } ;
 | 
					
						
							| 
									
										
										
										
											2009-04-11 21:30:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : <number-parse> ( str radix -- i number-parse n )
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  |     [ 0 ] 2dip [ dup length ] dip number-parse boa 0 ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-11 21:30:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : (next-digit) ( i number-parse n digit-quot end-quot -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ 2over length>> < ] 2dip
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  |     [ [ 2over str>> nth-unsafe >fixnum [ 1 fixnum+fast ] 3dip ] prepose ] dip if ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-06 22:15:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : require-next-digit ( i number-parse n quot -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ 3drop f ] (next-digit) ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : next-digit ( i number-parse n quot -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ 2nip ] (next-digit) ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : add-digit ( i number-parse n digit quot -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ [ dup radix>> ] [ * ] [ + ] tri* ] dip next-digit ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-10 02:40:17 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : digit-in-radix ( number-parse n char -- number-parse n digit ? )
 | 
					
						
							|  |  |  |     digit> pick radix>> over > ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-11 21:30:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : ?make-ratio ( num denom/f -- ratio/f )
 | 
					
						
							|  |  |  |     [ / ] [ drop f ] if* ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | TUPLE: float-parse | 
					
						
							| 
									
										
										
										
											2015-07-19 12:56:39 -04:00
										 |  |  |     { radix fixnum } | 
					
						
							|  |  |  |     { point } | 
					
						
							|  |  |  |     { exponent } ;
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : inc-point ( float-parse -- float-parse' )
 | 
					
						
							| 
									
										
										
										
											2015-07-19 12:56:39 -04:00
										 |  |  |     [ 1 + ] change-point ; inline
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : store-exponent ( float-parse n expt -- float-parse' n )
 | 
					
						
							| 
									
										
										
										
											2015-07-19 12:56:39 -04:00
										 |  |  |     swap [ >>exponent ] dip ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : ?store-exponent ( float-parse n expt/f -- float-parse' n/f )
 | 
					
						
							|  |  |  |     [ store-exponent ] [ drop f ] if* ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : ((pow)) ( base x -- base^x )
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:00:53 -04:00
										 |  |  |     [ 1 ] 2dip
 | 
					
						
							|  |  |  |     [ dup zero? ] [ | 
					
						
							|  |  |  |         dup odd? [ [ [ * ] keep ] [ 1 - ] bi* ] when
 | 
					
						
							|  |  |  |         [ sq ] [ 2/ ] bi*
 | 
					
						
							|  |  |  |     ] until 2drop ; inline
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : (pow) ( base x -- base^x )
 | 
					
						
							| 
									
										
										
										
											2015-06-11 23:00:53 -04:00
										 |  |  |     integer>fixnum-strict
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     dup 0 >= [ ((pow)) ] [ [ recip ] [ neg ] bi* ((pow)) ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : add-mantissa-digit ( float-parse i number-parse n digit quot -- float-parse' n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ [ inc-point ] 4dip ] dip add-digit ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : make-float-dec-exponent ( float-parse n/f -- float/f )
 | 
					
						
							|  |  |  |     [ [ radix>> ] [ point>> ] [ exponent>> ] tri - (pow) ] [ swap /f ] bi* ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : make-float-bin-exponent ( float-parse n/f -- float/f )
 | 
					
						
							|  |  |  |     [ drop [ radix>> ] [ point>> ] bi (pow) ] | 
					
						
							|  |  |  |     [ nip swap /f ] | 
					
						
							|  |  |  |     [ drop 2.0 swap exponent>> (pow) * ] 2tri ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 18:15:46 -05:00
										 |  |  | : ?default-exponent ( float-parse n/f -- float-parse' n/f' )
 | 
					
						
							|  |  |  |     over exponent>> [ | 
					
						
							| 
									
										
										
										
											2014-11-29 17:31:23 -05:00
										 |  |  |         over radix>> 10 = [ 0 store-exponent ] [ drop f ] if
 | 
					
						
							| 
									
										
										
										
											2011-11-26 18:15:46 -05:00
										 |  |  |     ] unless ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | : ?make-float ( float-parse n/f -- float/f )
 | 
					
						
							| 
									
										
										
										
											2011-11-11 18:49:53 -05:00
										 |  |  |     { float-parse object } declare | 
					
						
							| 
									
										
										
										
											2011-11-26 18:15:46 -05:00
										 |  |  |     ?default-exponent | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ dup not ] [ 2drop f ] } | 
					
						
							|  |  |  |         { [ over radix>> 10 = ] [ make-float-dec-exponent ] } | 
					
						
							|  |  |  |         [ make-float-bin-exponent ] | 
					
						
							| 
									
										
										
										
											2011-11-11 18:49:53 -05:00
										 |  |  |     } cond ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ?neg ( n/f -- -n/f )
 | 
					
						
							| 
									
										
										
										
											2015-07-14 23:03:33 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         dup bignum? [ | 
					
						
							|  |  |  |             dup first-bignum bignum= | 
					
						
							|  |  |  |             [ drop most-negative-fixnum ] [ neg ] if
 | 
					
						
							|  |  |  |         ] [ neg ] if
 | 
					
						
							|  |  |  |     ] [ f ] if* ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ?add-ratio ( m n/f -- m+n/f )
 | 
					
						
							|  |  |  |     dup ratio? [ + ] [ 2drop f ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : @abort ( i number-parse n x -- f )
 | 
					
						
							| 
									
										
										
										
											2012-09-28 12:16:08 -04:00
										 |  |  |     4drop f ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : @split ( i number-parse n -- n i number-parse n' )
 | 
					
						
							|  |  |  |     -rot 0 ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : @split-exponent ( i number-parse n -- n i number-parse' n' )
 | 
					
						
							| 
									
										
										
										
											2015-07-19 12:56:39 -04:00
										 |  |  |     -rot 10 >>radix 0 ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <float-parse> ( i number-parse n -- float-parse i number-parse n )
 | 
					
						
							| 
									
										
										
										
											2011-11-26 18:15:46 -05:00
										 |  |  |      [ drop nip radix>> 0 f float-parse boa ] 3keep ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEFER: @exponent-digit | 
					
						
							|  |  |  | DEFER: @mantissa-digit | 
					
						
							|  |  |  | DEFER: @denom-digit | 
					
						
							|  |  |  | DEFER: @num-digit | 
					
						
							|  |  |  | DEFER: @pos-digit | 
					
						
							|  |  |  | DEFER: @neg-digit | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @exponent-digit-or-punc ( float-parse i number-parse n char -- float-parse n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: , [ [ @exponent-digit ] require-next-digit ] } | 
					
						
							|  |  |  |         [ @exponent-digit ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @exponent-digit ( float-parse i number-parse n char -- float-parse n/f )
 | 
					
						
							|  |  |  |     { float-parse fixnum number-parse integer fixnum } declare | 
					
						
							|  |  |  |     digit-in-radix [ [ @exponent-digit-or-punc ] add-digit ] [ @abort ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @exponent-first-char ( float-parse i number-parse n char -- float-parse n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: - [ [ @exponent-digit ] require-next-digit ?neg ] } | 
					
						
							| 
									
										
										
										
											2010-02-07 17:21:50 -05:00
										 |  |  |         { CHAR: + [ [ @exponent-digit ] require-next-digit ] } | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |         [ @exponent-digit ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : ->exponent ( float-parse i number-parse n -- float-parse' n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     @split-exponent [ @exponent-first-char ] require-next-digit ?store-exponent ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : exponent-char? ( number-parse n char -- number-parse n char ? )
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  |     pick radix>> { | 
					
						
							| 
									
										
										
										
											2015-07-16 12:55:33 -04:00
										 |  |  |         { 10 [ dup "eE" member-eq? ] } | 
					
						
							|  |  |  |         [ drop dup "pP" member-eq? ] | 
					
						
							| 
									
										
										
										
											2009-10-22 18:26:22 -04:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : or-exponent ( i number-parse n char quot -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ exponent-char? [ drop <float-parse> ->exponent ?make-float ] ] dip if ; inline
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : or-mantissa->exponent ( float-parse i number-parse n char quot -- float-parse n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ exponent-char? [ drop ->exponent ] ] dip if ; inline
 | 
					
						
							| 
									
										
										
										
											2009-09-01 22:14:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @mantissa-digit-or-punc ( float-parse i number-parse n char -- float-parse n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: , [ [ @mantissa-digit ] require-next-digit ] } | 
					
						
							|  |  |  |         [ @mantissa-digit ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-10-22 21:28:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @mantissa-digit ( float-parse i number-parse n char -- float-parse n/f )
 | 
					
						
							|  |  |  |     { float-parse fixnum number-parse integer fixnum } declare | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     [ | 
					
						
							|  |  |  |         digit-in-radix | 
					
						
							|  |  |  |         [ [ @mantissa-digit-or-punc ] add-mantissa-digit ] | 
					
						
							|  |  |  |         [ @abort ] if
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     ] or-mantissa->exponent ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : ->mantissa ( i number-parse n -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     <float-parse> [ @mantissa-digit ] next-digit ?make-float ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : ->required-mantissa ( i number-parse n -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     <float-parse> [ @mantissa-digit ] require-next-digit ?make-float ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @denom-digit-or-punc ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: , [ [ @denom-digit ] require-next-digit ] } | 
					
						
							|  |  |  |         { CHAR: . [ ->mantissa ] } | 
					
						
							|  |  |  |         [ [ @denom-digit ] or-exponent ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @denom-digit ( i number-parse n char -- n/f )
 | 
					
						
							|  |  |  |     { fixnum number-parse integer fixnum } declare | 
					
						
							|  |  |  |     digit-in-radix [ [ @denom-digit-or-punc ] add-digit ] [ @abort ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @denom-first-digit ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: . [ ->mantissa ] } | 
					
						
							|  |  |  |         [ @denom-digit ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : ->denominator ( i number-parse n -- n/f )
 | 
					
						
							| 
									
										
										
										
											2011-11-11 18:49:53 -05:00
										 |  |  |     { fixnum number-parse integer } declare | 
					
						
							|  |  |  |     @split [ @denom-first-digit ] require-next-digit ?make-ratio ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @num-digit-or-punc ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: , [ [ @num-digit ] require-next-digit ] } | 
					
						
							|  |  |  |         { CHAR: / [ ->denominator ] } | 
					
						
							|  |  |  |         [ @num-digit ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @num-digit ( i number-parse n char -- n/f )
 | 
					
						
							|  |  |  |     { fixnum number-parse integer fixnum } declare | 
					
						
							|  |  |  |     digit-in-radix [ [ @num-digit-or-punc ] add-digit ] [ @abort ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : ->numerator ( i number-parse n -- n/f )
 | 
					
						
							| 
									
										
										
										
											2011-11-11 18:49:53 -05:00
										 |  |  |     { fixnum number-parse integer } declare | 
					
						
							|  |  |  |     @split [ @num-digit ] require-next-digit ?add-ratio ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @pos-digit-or-punc ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: , [ [ @pos-digit ] require-next-digit ] } | 
					
						
							|  |  |  |         { CHAR: + [ ->numerator ] } | 
					
						
							|  |  |  |         { CHAR: / [ ->denominator ] } | 
					
						
							|  |  |  |         { CHAR: . [ ->mantissa ] } | 
					
						
							|  |  |  |         [ [ @pos-digit ] or-exponent ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @pos-digit ( i number-parse n char -- n/f )
 | 
					
						
							|  |  |  |     { fixnum number-parse integer fixnum } declare | 
					
						
							|  |  |  |     digit-in-radix [ [ @pos-digit-or-punc ] add-digit ] [ @abort ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-23 21:29:39 -05:00
										 |  |  | : ->radix ( i number-parse n quot radix -- i number-parse n quot )
 | 
					
						
							| 
									
										
										
										
											2015-07-19 12:56:39 -04:00
										 |  |  |     [ >>radix ] curry 2dip ; inline
 | 
					
						
							| 
									
										
										
										
											2011-11-23 21:29:39 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : with-radix-char ( i number-parse n radix-quot nonradix-quot -- n/f )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         rot { | 
					
						
							| 
									
										
										
										
											2011-11-24 15:27:40 -05:00
										 |  |  |             { CHAR: b [ drop  2 ->radix require-next-digit ] } | 
					
						
							|  |  |  |             { CHAR: o [ drop  8 ->radix require-next-digit ] } | 
					
						
							|  |  |  |             { CHAR: x [ drop 16 ->radix require-next-digit ] } | 
					
						
							| 
									
										
										
										
											2011-11-23 21:29:39 -05:00
										 |  |  |             [ [ drop ] 2dip swap call ] | 
					
						
							|  |  |  |         } case
 | 
					
						
							|  |  |  |     ] 2curry next-digit ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @pos-first-digit ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: . [ ->required-mantissa ] } | 
					
						
							| 
									
										
										
										
											2011-11-24 15:39:52 -05:00
										 |  |  |         { CHAR: 0 [ [ @pos-digit ] [ @pos-digit-or-punc ] with-radix-char ] } | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |         [ @pos-digit ] | 
					
						
							| 
									
										
										
										
											2011-11-24 15:39:52 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @neg-digit-or-punc ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: , [ [ @neg-digit ] require-next-digit ] } | 
					
						
							|  |  |  |         { CHAR: - [ ->numerator ] } | 
					
						
							|  |  |  |         { CHAR: / [ ->denominator ] } | 
					
						
							|  |  |  |         { CHAR: . [ ->mantissa ] } | 
					
						
							|  |  |  |         [ [ @neg-digit ] or-exponent ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @neg-digit ( i number-parse n char -- n/f )
 | 
					
						
							|  |  |  |     { fixnum number-parse integer fixnum } declare | 
					
						
							|  |  |  |     digit-in-radix [ [ @neg-digit-or-punc ] add-digit ] [ @abort ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : @neg-first-digit ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: . [ ->required-mantissa ] } | 
					
						
							| 
									
										
										
										
											2011-11-24 15:39:52 -05:00
										 |  |  |         { CHAR: 0 [ [ @neg-digit ] [ @neg-digit-or-punc ] with-radix-char ] } | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |         [ @neg-digit ] | 
					
						
							| 
									
										
										
										
											2011-11-24 15:39:52 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 04:14:31 -04:00
										 |  |  | : @first-char ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { CHAR: - [ [ @neg-first-digit ] require-next-digit ?neg ] } | 
					
						
							| 
									
										
										
										
											2010-02-07 17:21:50 -05:00
										 |  |  |         { CHAR: + [ [ @pos-first-digit ] require-next-digit ] } | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  |         [ @pos-first-digit ] | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-09-01 22:14:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 23:16:34 -04:00
										 |  |  | : @neg-first-digit-no-radix ( i number-parse n char -- n/f )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { CHAR: . [ ->required-mantissa ] } | 
					
						
							|  |  |  |         [ @neg-digit ] | 
					
						
							|  |  |  |     } case ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : @pos-first-digit-no-radix ( i number-parse n char -- n/f )
 | 
					
						
							| 
									
										
										
										
											2011-12-16 20:20:05 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-14 23:16:34 -04:00
										 |  |  |         { CHAR: . [ ->required-mantissa ] } | 
					
						
							| 
									
										
										
										
											2014-11-29 15:54:48 -05:00
										 |  |  |         [ @pos-digit ] | 
					
						
							| 
									
										
										
										
											2011-12-16 20:20:05 -05:00
										 |  |  |     } case ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 23:16:34 -04:00
										 |  |  | : @first-char-no-radix ( i number-parse n char -- n/f )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { CHAR: - [ [ @neg-first-digit-no-radix ] require-next-digit ?neg ] } | 
					
						
							|  |  |  |         { CHAR: + [ [ @pos-first-digit-no-radix ] require-next-digit ] } | 
					
						
							|  |  |  |         [ @pos-first-digit-no-radix ] | 
					
						
							|  |  |  |     } case ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-06 21:05:03 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 20:20:05 -05:00
										 |  |  | : string>number ( str -- n/f )
 | 
					
						
							|  |  |  |     10 <number-parse> [ @first-char ] require-next-digit ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-16 20:20:05 -05:00
										 |  |  | : base> ( str radix -- n/f )
 | 
					
						
							|  |  |  |     <number-parse> [ @first-char-no-radix ] require-next-digit ;
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | : bin> ( str -- n/f )  2 base> ; inline
 | 
					
						
							|  |  |  | : oct> ( str -- n/f )  8 base> ; inline
 | 
					
						
							|  |  |  | : dec> ( str -- n/f ) 10 base> ; inline
 | 
					
						
							|  |  |  | : hex> ( str -- n/f ) 16 base> ; inline
 | 
					
						
							| 
									
										
										
										
											2009-11-01 01:26:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-27 20:54:24 -04:00
										 |  |  | CONSTANT: TENS B{ | 
					
						
							|  |  |  |     48 48 48 48 48 48 48 48 48 48 49 49 49 49 49 49 49 49 49 49
 | 
					
						
							|  |  |  |     50 50 50 50 50 50 50 50 50 50 51 51 51 51 51 51 51 51 51 51
 | 
					
						
							|  |  |  |     52 52 52 52 52 52 52 52 52 52 53 53 53 53 53 53 53 53 53 53
 | 
					
						
							|  |  |  |     54 54 54 54 54 54 54 54 54 54 55 55 55 55 55 55 55 55 55 55
 | 
					
						
							|  |  |  |     56 56 56 56 56 56 56 56 56 56 57 57 57 57 57 57 57 57 57 57
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CONSTANT: ONES B{ | 
					
						
							|  |  |  |     48 49 50 51 52 53 54 55 56 57 48 49 50 51 52 53 54 55 56 57
 | 
					
						
							|  |  |  |     48 49 50 51 52 53 54 55 56 57 48 49 50 51 52 53 54 55 56 57
 | 
					
						
							|  |  |  |     48 49 50 51 52 53 54 55 56 57 48 49 50 51 52 53 54 55 56 57
 | 
					
						
							|  |  |  |     48 49 50 51 52 53 54 55 56 57 48 49 50 51 52 53 54 55 56 57
 | 
					
						
							|  |  |  |     48 49 50 51 52 53 54 55 56 57 48 49 50 51 52 53 54 55 56 57
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-03-27 17:47:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : (two-digit) ( num accum -- num' accum )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         100 /mod [ TENS nth-unsafe ] [ ONES nth-unsafe ] bi
 | 
					
						
							|  |  |  |     ] dip [ push ] keep [ push ] keep ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (one-digit) ( num accum -- num' accum )
 | 
					
						
							|  |  |  |     [ 10 /mod CHAR: 0 + ] dip [ push ] keep ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (bignum>dec) ( num accum -- num' accum )
 | 
					
						
							|  |  |  |     [ over most-positive-fixnum > ] | 
					
						
							|  |  |  |     [ { bignum sbuf } declare (two-digit) ] while
 | 
					
						
							|  |  |  |     [ >fixnum ] dip ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (fixnum>dec) ( num accum -- num' accum )
 | 
					
						
							|  |  |  |     { fixnum sbuf } declare | 
					
						
							| 
									
										
										
										
											2013-03-27 21:01:59 -04:00
										 |  |  |     [ over 10 >= ] [ (two-digit) ] while
 | 
					
						
							| 
									
										
										
										
											2013-03-27 17:47:46 -04:00
										 |  |  |     [ over zero? ] [ (one-digit) ] until ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-28 14:55:52 -04:00
										 |  |  | GENERIC: (positive>dec) ( num -- str )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: bignum (positive>dec) | 
					
						
							|  |  |  |     12 <sbuf> (bignum>dec) (fixnum>dec) "" like reverse! nip ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (count-digits) ( digits n -- digits' )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { [ dup 10 < ] [ drop ] } | 
					
						
							|  |  |  |         { [ dup 100 < ] [ drop 1 fixnum+fast ] } | 
					
						
							|  |  |  |         { [ dup 1,000 < ] [ drop 2 fixnum+fast ] } | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             dup 1,000,000,000,000 < [ | 
					
						
							|  |  |  |                 dup 100,000,000 < [ | 
					
						
							|  |  |  |                     dup 1,000,000 < [ | 
					
						
							|  |  |  |                         dup 10,000 < [ | 
					
						
							|  |  |  |                             drop 3
 | 
					
						
							|  |  |  |                         ] [ | 
					
						
							|  |  |  |                             100,000 >= 5 4 ?
 | 
					
						
							|  |  |  |                         ] if
 | 
					
						
							|  |  |  |                     ] [ | 
					
						
							|  |  |  |                         10,000,000 >= 7 6 ?
 | 
					
						
							|  |  |  |                     ] if
 | 
					
						
							|  |  |  |                 ] [ | 
					
						
							|  |  |  |                     dup 10,000,000,000 < [ | 
					
						
							|  |  |  |                         1,000,000,000 >= 9 8 ?
 | 
					
						
							|  |  |  |                     ] [ | 
					
						
							|  |  |  |                         100,000,000,000 >= 11 10 ?
 | 
					
						
							|  |  |  |                     ] if
 | 
					
						
							|  |  |  |                 ] if fixnum+fast | 
					
						
							|  |  |  |             ] [ | 
					
						
							|  |  |  |                 [ 12 fixnum+fast ] [ 1,000,000,000,000 /i ] bi*
 | 
					
						
							|  |  |  |                 (count-digits) | 
					
						
							|  |  |  |             ] if
 | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } cond ; inline recursive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: fixnum (positive>dec) | 
					
						
							|  |  |  |     1 over (count-digits) <sbuf> (fixnum>dec) "" like reverse! nip ; inline
 | 
					
						
							| 
									
										
										
										
											2013-03-27 17:47:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : (positive>base) ( num radix -- str )
 | 
					
						
							| 
									
										
										
										
											2012-06-06 18:12:33 -04:00
										 |  |  |     dup 1 <= [ invalid-radix ] when
 | 
					
						
							| 
									
										
										
										
											2009-02-28 16:31:34 -05:00
										 |  |  |     [ dup 0 > ] swap [ /mod >digit ] curry "" produce-as nip
 | 
					
						
							| 
									
										
										
										
											2009-10-28 15:40:15 -04:00
										 |  |  |     reverse! ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-27 17:47:46 -04:00
										 |  |  | : positive>base ( num radix -- str )
 | 
					
						
							|  |  |  |     dup 10 = [ drop (positive>dec) ] [ (positive>base) ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 07:39:18 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | GENERIC# >base 1 ( n radix -- str )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-14 13:09:12 -04:00
										 |  |  | : number>string ( n -- str ) 10 >base ; inline
 | 
					
						
							| 
									
										
										
										
											2013-03-28 14:55:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-14 13:09:12 -04:00
										 |  |  | : >bin ( n -- str ) 2 >base ; inline
 | 
					
						
							|  |  |  | : >oct ( n -- str ) 8 >base ; inline
 | 
					
						
							|  |  |  | : >hex ( n -- str ) 16 >base ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | M: integer >base | 
					
						
							| 
									
										
										
										
											2015-07-19 19:45:46 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ over 0 = ] [ 2drop "0" ] } | 
					
						
							|  |  |  |         { [ over 0 > ] [ positive>base ] } | 
					
						
							|  |  |  |         [ [ neg ] dip positive>base CHAR: - prefix ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: ratio >base | 
					
						
							| 
									
										
										
										
											2015-07-19 19:45:46 -04:00
										 |  |  |     [ >fraction [ /mod ] keep ] [ [ >base ] curry tri@ ] bi*
 | 
					
						
							|  |  |  |     "/" glue over first-unsafe { | 
					
						
							|  |  |  |         { CHAR: 0 [ nip ] } | 
					
						
							|  |  |  |         { CHAR: - [ append ] } | 
					
						
							|  |  |  |         [ drop "+" glue ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  | : fix-float ( str -- newstr )
 | 
					
						
							| 
									
										
										
										
											2015-07-19 20:19:09 -04:00
										 |  |  |     CHAR: e over index [ | 
					
						
							|  |  |  |         cut [ fix-float ] dip append
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         CHAR: . over member? [ ".0" append ] unless
 | 
					
						
							| 
									
										
										
										
											2015-07-19 20:19:09 -04:00
										 |  |  |     ] if* ;
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  | : mantissa-expt-normalize ( mantissa expt -- mantissa' expt' )
 | 
					
						
							| 
									
										
										
										
											2012-06-18 17:32:39 -04:00
										 |  |  |     [ dup log2 52 swap - [ shift 52 2^ 1 - bitand ] [ 1022 + neg ] bi ] | 
					
						
							|  |  |  |     [ 1023 - ] if-zero ;
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mantissa-expt ( float -- mantissa expt )
 | 
					
						
							|  |  |  |     [ 52 2^ 1 - bitand ] | 
					
						
							|  |  |  |     [ -0.0 double>bits bitnot bitand -52 shift ] bi
 | 
					
						
							|  |  |  |     mantissa-expt-normalize ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : float>hex-sign ( bits -- str )
 | 
					
						
							|  |  |  |     -0.0 double>bits bitand zero? "" "-" ? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : float>hex-value ( mantissa -- str )
 | 
					
						
							| 
									
										
										
										
											2011-10-14 13:09:12 -04:00
										 |  |  |     >hex 13 CHAR: 0 pad-head [ CHAR: 0 = ] trim-tail
 | 
					
						
							| 
									
										
										
										
											2011-10-15 22:19:44 -04:00
										 |  |  |     [ "0" ] when-empty "1." prepend ;
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : float>hex-expt ( mantissa -- str )
 | 
					
						
							|  |  |  |     10 >base "p" prepend ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : float>hex ( n -- str )
 | 
					
						
							|  |  |  |     double>bits
 | 
					
						
							|  |  |  |     [ float>hex-sign ] [ | 
					
						
							|  |  |  |         mantissa-expt [ float>hex-value ] [ float>hex-expt ] bi*
 | 
					
						
							|  |  |  |     ] bi 3append ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  | : format-string ( format -- format )
 | 
					
						
							|  |  |  |     0 suffix >byte-array ; foldable
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : format-head ( byte-array n -- string )
 | 
					
						
							|  |  |  |     swap over 0 <string> [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             [ [ nth-unsafe ] 2keep drop ] | 
					
						
							|  |  |  |             [ set-string-nth-fast ] bi*
 | 
					
						
							|  |  |  |         ] 2curry each-integer
 | 
					
						
							|  |  |  |     ] keep ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-14 00:21:28 -04:00
										 |  |  | : format-float ( n format -- string )
 | 
					
						
							| 
									
										
										
										
											2014-11-29 15:47:57 -05:00
										 |  |  |     format-string (format-float) | 
					
						
							|  |  |  |     dup [ 0 = ] find drop
 | 
					
						
							|  |  |  |     format-head fix-float ; inline
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-08 10:32:01 -04:00
										 |  |  | : float>base ( n radix -- str )
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         { 16 [ float>hex ] } | 
					
						
							| 
									
										
										
										
											2012-06-06 17:50:07 -04:00
										 |  |  |         { 10 [ "%.16g" format-float ] } | 
					
						
							| 
									
										
										
										
											2012-06-08 10:32:01 -04:00
										 |  |  |         [ invalid-radix ] | 
					
						
							| 
									
										
										
										
											2009-10-22 18:26:22 -04:00
										 |  |  |     } case ; inline
 | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | M: float >base | 
					
						
							| 
									
										
										
										
											2009-09-11 21:11:29 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ over fp-nan? ] [ 2drop "0/0." ] } | 
					
						
							|  |  |  |         { [ over 1/0. =  ] [ 2drop "1/0." ] } | 
					
						
							|  |  |  |         { [ over -1/0. = ] [ 2drop "-1/0." ] } | 
					
						
							|  |  |  |         { [ over  0.0 fp-bitwise= ] [ 2drop  "0.0" ] } | 
					
						
							|  |  |  |         { [ over -0.0 fp-bitwise= ] [ 2drop "-0.0" ] } | 
					
						
							|  |  |  |         [ float>base ] | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-22 18:26:22 -04:00
										 |  |  | : # ( n -- ) number>string % ; inline
 |