Deutsch   English   Français   Italiano  
<v6r644$310o4$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Krishna Myneni <krishna.myneni@ccreweb.org>
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: <v6r644$310o4$1@dont-email.me>
References: <v6c8v0$3usoe$1@dont-email.me>
 <9c8e8993d3413e65caf355ecc6ceea31@www.novabbs.com>
 <v6cl84$obt$2@dont-email.me>
 <5027ddf17f1061435c0ef1df0c5a2061@www.novabbs.com>
 <v6e4gn$bjep$1@dont-email.me> <v6e8vu$bdbc$1@dont-email.me>
 <v6gm4j$s90n$2@dont-email.me> <v6leh4$1qbfn$1@dont-email.me>
 <668e491f$1@news.ausics.net> <668e87ec$1@news.ausics.net>
 <v6ok8g$2fbdd$1@dont-email.me>
 <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 ===