math.integers: bignum/f rounding was wrong (reported by Joe Groff)

db4
Slava Pestov 2010-11-13 16:02:12 -08:00
parent 65dcd56b0b
commit 0c840a7965
2 changed files with 14 additions and 3 deletions

View File

@ -216,8 +216,8 @@ unit-test
: random-integer ( -- n )
32 random-bits
1 random zero? [ neg ] when
1 random zero? [ >bignum ] when ;
{ t f } random [ neg ] when
{ t f } random [ >bignum ] when ;
[ t ] [
10000 [
@ -232,5 +232,11 @@ unit-test
[ HEX: 1.758bec11492f9p-54 ] [ 1 12345678901234567 /f ] unit-test
[ HEX: -1.758bec11492f9p-54 ] [ 1 -12345678901234567 /f ] unit-test
! Ensure that /f rounds to nearest and not to zero
[ HEX: 1.0p55 ] [ HEX: 7f,ffff,ffff,ffff >bignum 1 /f ] unit-test
[ HEX: 1.0p55 ] [ HEX: -7f,ffff,ffff,ffff >bignum -1 /f ] unit-test
[ HEX: -1.0p55 ] [ HEX: -7f,ffff,ffff,ffff >bignum 1 /f ] unit-test
[ HEX: -1.0p55 ] [ HEX: 7f,ffff,ffff,ffff >bignum -1 /f ] unit-test
[ 17 ] [ 17 >bignum 5 max ] unit-test
[ 5 ] [ 17 >bignum 5 min ] unit-test

View File

@ -140,13 +140,18 @@ M: bignum (log2) bignum-log2 ; inline
[ 2/ ] dip over log2 52 > [ [ 2/ ] [ 1 + ] bi* ] when
[ unscaled-float ] dip scale-float ; inline
: round-to-nearest ( fraction-and-guard rem -- fraction-and-guard' )
over odd?
[ zero? [ dup zero? [ 1 + ] unless ] [ 1 + ] if ] [ drop ] if ;
inline
! Main word
: /f-abs ( m n -- f )
over zero? [ nip zero? 0/0. 0.0 ? ] [
[ drop 1/0. ] [
pre-scale
/f-loop
[ over odd? [ zero? [ 1 + ] unless ] [ drop ] if ] dip
[ round-to-nearest ] dip
post-scale
] if-zero
] if ; inline