1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators.short-circuit kernel lexer math
4 math.functions math.order math.parser prettyprint.backend
5 prettyprint.custom prettyprint.sections sequences splitting
9 TUPLE: decimal { mantissa read-only } { exponent read-only } ;
13 : >decimal< ( decimal -- mantissa exponent )
14 [ mantissa>> ] [ exponent>> ] bi ; inline
16 : string>decimal ( string -- decimal )
18 [ [ CHAR: 0 = ] trim-head [ "0" ] when-empty ]
19 [ [ CHAR: 0 = ] trim-tail [ "" ] when-empty ] bi*
20 [ append string>number ] [ nip length neg ] 2bi <decimal> ;
22 : parse-decimal ( -- decimal ) scan-token string>decimal ;
24 SYNTAX: DECIMAL: parse-decimal suffix! ;
26 : decimal>ratio ( decimal -- ratio ) >decimal< 10^ * ;
28 : decimal>float ( decimal -- float ) decimal>ratio >float ;
30 : scale-mantissas ( D1 D2 -- m1 m2 exp )
31 [ [ mantissa>> ] bi@ ]
37 [ 10^ [ * ] curry dip f ] if
41 : scale-decimals ( D1 D2 -- D1' D2' )
42 scale-mantissas [ <decimal> ] curry bi@ ;
44 ERROR: decimal-types-expected d1 d2 ;
46 : guard-decimals ( obj1 obj2 -- D1 D2 )
47 2dup [ decimal? ] both? [ decimal-types-expected ] unless ;
51 [ [ decimal? ] both? ]
55 [ [ mantissa>> ] same? ]
56 [ [ exponent>> ] same? ]
62 guard-decimals scale-decimals [ mantissa>> ] bi@ < ;
65 [ mantissa>> abs ] [ exponent>> ] bi <decimal> ;
68 guard-decimals scale-mantissas [ + ] dip <decimal> ;
71 guard-decimals scale-mantissas [ - ] dip <decimal> ;
74 guard-decimals [ >decimal< ] bi@ swapd + [ * ] dip <decimal> ;
76 :: D/ ( D1 D2 a -- D3 )
77 D1 D2 guard-decimals [ >decimal< ] bi@ :> ( m1 e1 m2 e2 )
85 2dup before? [ 2drop +lt+ ] [ equal? +eq+ +gt+ ? ] if ; inline
89 [ mantissa>> abs number>string ]
91 exponent>> dup 0 > [ CHAR: 0 <string> append ] [
94 [ CHAR: 0 pad-head ] [ cut-slice* ] bi
95 over empty? [ nip "0." prepend ] [ "." glue ] if
99 [ mantissa>> 0 < [ "-" prepend ] when ] tri text