On math FP emulation, by looking up the code it seems pretty close to the code
from Robert F. Illyes for Forth 83.
Forth implementation in Eforth it's like this:
( FORTH-83 FLOATING POINT.
----------------------------------
COPYRIGHT 1985 BY ROBERT F. ILLYES
PO BOX 2516, STA. A
CHAMPAIGN, IL 61820
PHONE: 217/826-2734 ) HEX
: ZERO OVER 0= IF DROP 0 THEN ;
: FNEGATE 8000 XOR ZERO ;
: FABS 7FFF AND ;
: NORM >R 2DUP OR
IF BEGIN DUP 0< NOT
WHILE D2* R> 1- >R
REPEAT SWAP 0< - ?DUP
IF R> ELSE 8000 R> 1+ THEN
ELSE R> DROP THEN ;
: F2* 1+ ZERO ;
: F* ROT + 4000 - >R UM* R> NORM ;
: FSQ 2DUP F* ;
: F2/ 1- ZERO ;
: UM/ DUP >R UM/MOD SWAP R>
OVER 2* 1+ U< SWAP 0< OR - ;
: F/ ROT SWAP - 4000 + >R
0 ROT ROT 2DUP U<
IF UM/ R> ZERO
ELSE >R D2/ FABS R> UM/ R> 1+
THEN ;
: ALIGN 20 MIN 0 DO D2/ LOOP ;
: RALIGN 1- ?DUP IF ALIGN THEN
1 0 D+ D2/ ;
: FSIGN FABS OVER 0< IF >R DNEGATE R>
8000 OR THEN ;
: F+ ROT 2DUP >R >R FABS SWAP FABS -
DUP IF DUP 0<
IF ROT SWAP NEGATE
R> R> SWAP >R >R
THEN 0 SWAP RALIGN
THEN SWAP 0 R> R@ XOR 0<
IF R@ 0< IF 2SWAP THEN D-
R> FSIGN ROT SWAP NORM
ELSE D+ IF 1+ 2/ 8000 OR R> 1+
ELSE R> THEN THEN ;
: F- FNEGATE F+ ;
: F< F- 0< SWAP DROP ;
( FLOATING POINT INPUT/OUTPUT ) DECIMAL
CREATE PL 3 , HERE ,001 , , ,010 , ,
,100 , , 1,000 , ,
10,000 , , 100,000 , ,
1,000,000 , , 10,000,000 , ,
100,000,000 , , 1,000,000,000 , ,
: TENS 2* 2* LITERAL + 2@ ; HEX
: PLACES PL ! ;
: SHIFTS FABS 4010 - DUP 0< NOT
ABORT" TOO BIG" NEGATE ;
: F# >R PL @ TENS DROP UM* R> SHIFTS
RALIGN PL @ ?DUP IF 0 DO # LOOP
". HOLD THEN #S ROT SIGN ;
: TUCK SWAP OVER ;
: F. TUCK <# F# #> TYPE SPACE ;
: DFLOAT 4020 FSIGN NORM ;
: F DFLOAT POINT TENS DFLOAT F/ ;
: FCONSTANT F 2CONSTANT ;
: FLOAT DUP 0< DFLOAT ;
: -+ DROP SWAP 0< IF NEGATE THEN ;
: FIX TUCK 0 SWAP SHIFTS RALIGN -+ ;
: INT TUCK 0 SWAP SHIFTS ALIGN -+ ;
1. FCONSTANT ONE DECIMAL
34.6680 FCONSTANT X1
-57828. FCONSTANT X2
2001.18 FCONSTANT X3
1.4427 FCONSTANT X4
: EXP 2DUP INT DUP >R FLOAT F-
F2* X2 2OVER FSQ X3 F+ F/
2OVER F2/ F- X1 F+ F/
ONE F+ FSQ R> + ;
: FEXP X4 F* EXP ;
: GET BL WORD DUP 1+ C@ "- = TUCK -
0 0 ROT CONVERT DROP -+ ;
: E F GET >R R@ ABS 13301 4004 */MOD
>R FLOAT 4004 FLOAT F/ EXP R> +
R> 0< IF F/ ELSE F* THEN ;
: E. TUCK FABS 16384 TUCK -
4004 13301 */MOD >R
FLOAT 4004 FLOAT F/ EXP F*
2DUP ONE F<
IF 10 FLOAT F* R> 1- >R THEN
<# R@ ABS 0 #S R> SIGN 2DROP
"E HOLD F# #> TYPE SPACE ;
the float abs function it's literally the same, operating over the same bits.
On the lack of floating point on some arch, Forth itself (even ANS Forth) encourages you to follow a fixed point philosophy unless it's absolutely neccesary, because you can always scale up the magnitudes on big 32 bit machines.
And Pi can be prise enough by using scaling with 'double' (for 16 bit machines) numbers:
Forth implementation in Eforth it's like this:
the float abs function it's literally the same, operating over the same bits.On the lack of floating point on some arch, Forth itself (even ANS Forth) encourages you to follow a fixed point philosophy unless it's absolutely neccesary, because you can always scale up the magnitudes on big 32 bit machines.
And Pi can be prise enough by using scaling with 'double' (for 16 bit machines) numbers:
100.000 355 113 m*/ d. 314159 ok