forth_computer/float.fth

54 lines
2.0 KiB
Forth
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

: FLOAT-EXP 1+ C@ ;
: FLOAT-SIGN @ 128 AND ;
: FLOAT-DIGITS 2@ DUP 65280 AND IF 127 AND 128 OR ELSE 127 AND
THEN ;
: FLOAT-SIGNED FLOAT-SIGN IF DNEGATE THEN ;
: LEADING-0s 32768 16 0 DO 2DUP AND IF DROP I UNLOOP EXIT THEN
1 RSHIFT LOOP DROP 16 ;
: DLEADING-0s LEADING-0s DUP 16 = IF DROP >R LEADING-0s 16 +
R> SWAP THEN ;
: TLEADING-0s LEADING-0s DUP 16 = IF DROP >R DLEADING-0s 16 +
R> SWAP THEN ;
: FLOATS 4 * ;
: FLOAT+ 4 + ;
: FLOAT- 4 - ;
: RFLOAT ;
:NONAME 2>R 2R@ [ 'NUMBER @ COMPILE, ] DUP 0= IF 2R> 2DROP
EXIT THEN 2DROP 0 ?DO DROP LOOP 0 2R> RFLOAT ; 'NUMBER !
VARIABLE FSTACK
8 FLOATS ALLOT
FSTACK 2 + FSTACK !
: FFIRST FSTACK @ ;
: FSECOND FSTACK @ FLOAT- ;
: FR IF DUP 128 AND >R 128 OR 1 M+ 65407 AND R> OR THEN ;
: F+ FSECOND FLOAT-EXP FFIRST FLOAT-EXP - DUP 0< IF NEGATE
FSECOND FLOAT-DIGITS ROT DRSHIFT FSECOND FLOAT-SIGNED FFIRST
FLOAT-DIGITS FFIRST FLOAT-SIGNED D+ 2DUP D0= IF ELSE
2DUP D0< IF 128 >R DNEGATE
ELSE 0 >R THEN DLEADING-0s 8 - DUP >R 0< IF R@ NEGATE DRSHIFT
ELSE R@ DLSHIFT THEN FFIRST FLOAT-EXP R> - 256 * OR 65407 AND
R> OR THEN
ELSE FFIRST FLOAT-DIGITS ROT DRSHIFT FFIRST FLOAT-SIGNED
FSECOND FLOAT-DIGITS FSECOND FLOAT-SIGNED D+ 2DUP D0= IF ELSE
2DUP D0< IF 128 >R
DNEGATE ELSE 0 >R THEN DLEADING-0s 8 - DUP >R 0< IF R@ NEGATE
DRSHIFT ELSE R@ DLSHIFT THEN FSECOND FLOAT-EXP R> - 256 * OR
65407 AND R> OR THEN THEN FSECOND DUP FSTACK ! 2! ;
: F- FFIRST @ 128 XOR FFIRST ! F+ ;
: F* FFIRST FLOAT-DIGITS FSECOND FLOAT-DIGITS UD* DUP 0< IF 1
DRSHIFT 1 ELSE 0 THEN >R 6 DRSHIFT OVER 1 AND R> 2>R 1 DRSHIFT
ROT DROP DUP 128 AND IF 65407 AND FFIRST
FLOAT-SIGN FSECOND FLOAT-SIGN XOR OR FFIRST FLOAT-EXP FSECOND
FLOAT-EXP + 128 - R> + 8 LSHIFT OR R> FR ELSE
2R> 2DROP THEN FSECOND DUP
FSTACK ! 2! ;
: F. FFIRST FLOAT-SIGN IF 45 EMIT THEN FFIRST FLOAT-EXP 128 -
. FFIRST FLOAT-DIGITS D. FSTACK @ FLOAT- FSTACK ! ;
: FPOP FSTACK @ 2@ FSTACK @ FLOAT- FSTACK ! ;
: FPUSH FSTACK @ FLOAT+ DUP FSTACK ! 2! ;
: FCONSTANT CREATE FPOP , , DOES> 2@ FPUSH ;
0 33568 FPUSH FCONSTANT TEN
52429 31820 FPUSH FCONSTANT 1/10
TEN TEN F* F.
1/10 1/10 F+ F.