On 7/11/24 10:18, minforth wrote:
Had them somewhere on my drive, but have no access
to my system right now, so could not double-check
whether this is still correct:
\ Check double symmetric and floored division
1 8 CELLS 1- LSHIFT CONSTANT MSB
MSB INVERT CONSTANT MINT
T{ 0. 1. d/rem -> 0. 0. }T
T{ 2. 3. d/rem -> 2. 0. }T
T{ 10. 7. d/rem -> 3. 1. }T
T{ -10. 7. d/rem -> -3. -1. }T
T{ 10. -7. d/rem -> 3. -1. }T
T{ -10. -7. d/rem -> -3. 1. }T
T{ 0 1 2. d/rem -> 0. msb 0 }T
T{ 0 mint 2. d/rem -> 0. msb mint 2/ }T
T{ -1 mint 2dup d/rem -> 0. 1. }T
T{ 1 mint 0 mint d/rem -> 1. 1. }T
T{ 0 mint 1 mint d/rem -> 0 mint 0. }T
T{ -1 mint 2. d/rem -> 1. -1 mint 1 rshift }T
T{ 10. 7. d/mod -> 3. 1. }T
T{ -10. 7. d/mod -> 4. -2. }T
T{ 10. -7. d/mod -> -4. -2. }T
T{ -10. -7. d/mod -> -3. 1. }T
T{ 0. 1. d/ -> 0. }T
T{ 20. 7. d/ -> 2. }T
T{ -20. 7. d/ -> -2. }T
T{ 20. -7. d/ -> -2. }T
T{ -20. -7. d/ -> 2. }T
I ran your tests for D/REM and D/ against the source definitions provided by dxf. dxf's D/MOD is your D/REM (I assume your D/MOD is a floored division word). I renamed dxf's D/MOD to D/REM for your tests and commented out your D/MOD tests.
On symmetric division systems, the definition of D/REM below should be reverted to D/MOD as in his original posting
Below is the code and test results, under kForth-64.
-- Krishna=== begin double-number-division-tests.4th ===\ Check double symmetric and floored division\ Posted by minforth on comp.lang.forth on 11 July 2024include ans-words
include ttester
\ double number division words posted on comp.lang.forth
\ by dxf on 10 July 2024; renamed D/MOD to D/REM
\
\ DUM/MOD ( uq ud -- udrem udquot )
\ DU/MOD ( ud1 ud2 -- udrem udquot )
\ D/REM ( d1 d2 -- drem dquot ) ( originally D/MOD )
\ D/ ( d1 d2 -- dquot )
2variable d
\ Divide quad by double. Unsigned.
: DUM/MOD ( uq ud -- udrem udquot )
d 2! [ 16 cells ] literal 0 do
dup >r 2swap dup >r d2* 2swap d2*
r> 0< dup d- 2dup d 2@ du< 0= r> 0< or
if d 2@ d- 2swap 1 0 d+ 2swap then
loop 2swap ;
\ Divide doubles. Unsigned.
: DU/MOD ( ud1 ud2 -- udrem udquot )
0 0 2swap dum/mod ;
\ Divide doubles. Signed. Symmetric; originally D/MOD
: D/REM ( d1 d2 -- drem dquot )
2 pick 2dup xor 2>r dabs 2swap dabs
2swap du/mod r> 0< if dnegate then
r> 0< if 2swap dnegate 2swap then ;
\ Divide doubles. Signed symmetric
: D/ ( d1 d2 -- dquot )
D/REM 2swap 2drop ;
1 8 CELLS 1- LSHIFT CONSTANT MSB
MSB INVERT CONSTANT MINT
TESTING D/REM
T{ 0 s>d 1 s>d d/rem -> 0 s>d 0 s>d }T
T{ 2 s>d 3 s>d d/rem -> 2 s>d 0 s>d }T
T{ 10 s>d 7 s>d d/rem -> 3 s>d 1 s>d }T
T{ -10 s>d 7 s>d d/rem -> -3 s>d -1 s>d }T
T{ 10 s>d -7 s>d d/rem -> 3 s>d -1 s>d }T
T{ -10 s>d -7 s>d d/rem -> -3 s>d 1 s>d }T
T{ 0 1 2 s>d d/rem -> 0 s>d msb 0 }T
T{ 0 mint 2 s>d d/rem -> 0 s>d msb mint 2/ }T
T{ -1 mint 2dup d/rem -> 0 s>d 1 s>d }T
T{ 1 mint 0 mint d/rem -> 1 s>d 1 s>d }T
T{ 0 mint 1 mint d/rem -> 0 mint 0 s>d }T
T{ -1 mint 2 s>d d/rem -> 1 s>d -1 mint 1 rshift }T
0 [IF]
TESTING D/MOD
T{ 10 s>d 7 s>d d/mod -> 3 s>d 1 s>d }T
T{ -10 s>d 7 s>d d/mod -> 4 s>d -2 s>d }T
T{ 10 s>d -7 s>d d/mod -> -4 s>d -2 s>d }T
T{ -10 s>d -7 s>d d/mod -> -3 s>d 1 s>d }T
[THEN]
TESTING D/
T{ 0 s>d 1 s>d d/ -> 0 s>d }T
T{ 20 s>d 7 s>d d/ -> 2 s>d }T
T{ -20 s>d 7 s>d d/ -> -2 s>d }T
T{ 20 s>d -7 s>d d/ -> -2 s>d }T
T{ -20 s>d -7 s>d d/ -> 2 s>d }T
=== end double-number-division-tests.4th ===
=== begin execution output ===
include double-number-division-tests
TESTING D/REM
TESTING D/
ok
=== end execution output ===