Inhaltsverzeichnis

double number words

Bitte hier Beispiele für die Implementation doppelt genauer Berechnungen ablegen.

Handy Reference Card

Im Gforth sind all diese Worte vorhanden.

Optional Double-Number Word Set

2CONSTANT( x1 x2 „<spaces>name“ – )
2LITERALcompiletime: ( x1 x2 – ) Run-time: ( – x1 x2 )
2VARIABLE( „<spaces>name“ – ) ; d! d@ fehlen im ANS?
name Execution: ( – a-addr )
D+( ud1 ud2 – ud3 )
D-( ud1 ud2 – ud3 )
D.( d – )
D.R( d n – )
D0<( d – flag )
D0=( xd – flag )
D2*( xd1 – xd2 )
D2/( xd1 – xd2 )
D<( d1 d2 – flag )
D=( xd1 xd2 – flag )
D>S( d – n )
DABS( d – ud )
DMAX( d1 d2 – d3 )
DMIN( d1 d2 – d3 ) \d3 is the lesser of d1 and d2.
DNEGATE ( d1 – d2 )
M*/( d1 n1 +n2 – d2 ) ohne rest; integer operation.
Multiply d1 by n1 producing the triple-cell intermediate result t.
Divide t by +n2 giving the double-cell quotient d2.
M+( ud1 n – ud2 )

Double-Number extension words

2ROT ( x1 x2 x3 x4 x5 x6 – x3 x4 x5 x6 x1 x2 )
DU< ( ud1 ud2 – flag )

More Double-Number Words

Seine Sammlung d-number.fs hat Luca Masini in der VD veröffentlich und freigegeben.

Memory

: d! ( d adr -- )  >r r@ cell + ! r> ! ; \ "d-store"
: d@ ( adr -- d )  >r r@ @ r> cell + @ ; \ "d-fetch"

Logic and shift words

: dand    ( d d -- d     ) rot and >r and r>       ;
: dinvert (   d -- d     ) swap invert swap invert ;
: dlshift ( d u -- d     ) 0 ?do d2* loop          ;
: dor     ( d d -- d     ) rot or  >r or  r>       ;
: dnot    (   d -- 0.|1. ) d0= abs s>d             ;
: drshift ( d u -- d     ) 0 ?do d2/ loop dabs     ;
: dxor    ( d d -- d     ) rot xor >r xor r>       ;

d* "d-star"

Dieses d funktioniert auch auf 64-Bit-Maschinen richtig. <code> : d* ( ud1 ud2 – udprod ) >r swap >r 2dup um* 2swap r> * swap r> * + + ; </code> BTW: Obwohl der Stackeffekt hier „ud“ angibt, ist das Ergebnis auch für Faktoren mit Vorzeichen richtig (genauso wie bei ), solange kein Überlauf stattfindet. (Danke Bernd)

Wie funktioniert das eigentlich? –

> [[d-star-collection]]