: 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 [
[ 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
[ 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