Path: ...!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Krishna Myneni Newsgroups: comp.lang.forth Subject: Re: exercise in double number arithmetic Date: Fri, 12 Jul 2024 07:04:17 -0500 Organization: A noiseless patient Spider Lines: 127 Message-ID: References: <9c8e8993d3413e65caf355ecc6ceea31@www.novabbs.com> <5027ddf17f1061435c0ef1df0c5a2061@www.novabbs.com> <668e491f$1@news.ausics.net> <668e87ec$1@news.ausics.net> <2962ea213c6c800c67b35fc016346521@www.novabbs.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Fri, 12 Jul 2024 14:04:21 +0200 (CEST) Injection-Info: dont-email.me; posting-host="6dab93fc531cbd60824832dea000536b"; logging-data="3179268"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/RLaFCXynfI/0BdU/J3hOZ" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:uOXqxj4hn13LYGyu4fyY9Oz0V0Q= Content-Language: en-US In-Reply-To: <2962ea213c6c800c67b35fc016346521@www.novabbs.com> Bytes: 5263 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 2024 include 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 ===