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.parser parser sequences splitting
8 TUPLE: decimal { mantissa read-only } { exponent read-only } ;
10 : <decimal> ( mantissa exponent -- decimal ) decimal boa ;
12 : >decimal< ( decimal -- mantissa exponent )
13 [ mantissa>> ] [ exponent>> ] bi ; inline
15 : string>decimal ( string -- decimal )
17 [ [ CHAR: 0 = ] trim-head [ "0" ] when-empty ]
18 [ [ CHAR: 0 = ] trim-tail [ "" ] when-empty ] bi*
19 [ append string>number ] [ nip length neg ] 2bi <decimal> ;
21 : parse-decimal ( -- decimal ) scan string>decimal ;
23 SYNTAX: D: parse-decimal parsed ;
25 : decimal>ratio ( decimal -- ratio ) >decimal< 10^ * ;
26 : decimal>float ( decimal -- ratio ) decimal>ratio >float ;
28 : scale-mantissas ( D1 D2 -- m1 m2 exp )
29 [ [ mantissa>> ] bi@ ]
35 [ 10^ [ * ] curry dip f ] if
39 : scale-decimals ( D1 D2 -- D1' D2' )
41 [ scale-mantissas <decimal> nip ] 2bi ;
43 ERROR: decimal-types-expected d1 d2 ;
45 : guard-decimals ( obj1 obj2 -- D1 D2 )
46 2dup [ decimal? ] both?
47 [ decimal-types-expected ] unless ;
51 [ [ decimal? ] both? ]
55 [ [ mantissa>> ] bi@ = ]
56 [ [ exponent>> ] bi@ = ]
62 guard-decimals scale-decimals
63 [ mantissa>> ] bi@ < ;
66 [ mantissa>> abs ] [ exponent>> ] bi <decimal> ;
69 guard-decimals scale-mantissas [ + ] dip <decimal> ;
72 guard-decimals scale-mantissas [ - ] dip <decimal> ;
75 guard-decimals [ >decimal< ] bi@ swapd + [ * ] dip <decimal> ;
77 :: D/ ( D1 D2 a -- D3 )
78 D1 D2 guard-decimals 2drop
79 D1 >decimal< :> e1 :> m1
80 D2 >decimal< :> e2 :> m2