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* funktioniert auch auf 64-Bit-Maschinen richtig.
: d* ( ud1 ud2 -- udprod ) >r swap >r 2dup um* 2swap r> * swap r> * + + ;
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