Bitte hier Beispiele für die Implementation doppelt genauer Berechnungen ablegen.
Im Gforth sind all diese Worte vorhanden.
2CONSTANT | ( x1 x2 „<spaces>name“ – ) |
2LITERAL | compiletime: ( 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 ) |
Seine Sammlung d-number.fs hat Luca Masini in der VD veröffentlich und freigegeben.
: d! ( d adr -- ) >r r@ cell + ! r> ! ; \ "d-store" : d@ ( adr -- d ) >r r@ @ r> cell + @ ; \ "d-fetch"
: 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> ;
Dieses d
), solange kein Überlauf stattfindet. (Danke Bernd)
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
Wie funktioniert das eigentlich? –
> [[d-star-collection]]
—