math.parser: don't lose precision in make-float-bin-exponent
parent
fc029a937c
commit
dce2ca1366
|
@ -367,3 +367,9 @@ unit-test
|
|||
|
||||
{ t } [ most-positive-fixnum number>string string>number fixnum? ] unit-test
|
||||
{ t } [ most-negative-fixnum number>string string>number fixnum? ] unit-test
|
||||
|
||||
! large/small numbers/exponents correctly cancel out
|
||||
{ 1.0 } [ "1" 3000 [ CHAR: 0 ] "" replicate-as append "e-3000" append string>number ] unit-test
|
||||
{ 1.0 } [ "0x1" 1000 [ CHAR: 0 ] "" replicate-as append "p-4000" append string>number ] unit-test
|
||||
{ 1.0 } [ "0." 3000 [ CHAR: 0 ] "" replicate-as append "1e3001" append string>number ] unit-test
|
||||
{ 1.0 } [ "0x0." 1000 [ CHAR: 0 ] "" replicate-as append "1p4004" append string>number ] unit-test
|
||||
|
|
|
@ -84,10 +84,18 @@ TUPLE: float-parse
|
|||
: make-float-dec-exponent ( float-parse n/f -- float/f )
|
||||
[ [ radix>> ] [ point>> ] [ exponent>> ] tri - (pow) ] [ swap /f ] bi* ; inline
|
||||
|
||||
: base2-digits ( digits radix -- digits' )
|
||||
{
|
||||
{ 16 [ 4 * ] }
|
||||
{ 8 [ 3 * ] }
|
||||
{ 2 [ ] }
|
||||
} case ; inline
|
||||
|
||||
: base2-point ( float-parse -- point )
|
||||
[ point>> ] [ radix>> ] bi base2-digits ; 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
|
||||
[ [ drop 2 ] [ base2-point ] [ exponent>> ] tri - (pow) ] [ swap /f ] bi* ; inline
|
||||
|
||||
: ?default-exponent ( float-parse n/f -- float-parse' n/f' )
|
||||
over exponent>> [
|
||||
|
|
Loading…
Reference in New Issue