On math FP emulation, by looking up the code it seems pretty close to the code
from Robert F. Illyes for Forth 83.<p>Forth implementation in Eforth it's like this:<p><pre><code> ( 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 ;
</code></pre>
the float abs function it's literally the same, operating over the same bits.<p>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.<p>And Pi can be prise enough by using scaling with 'double' (for 16 bit machines) numbers:<p>100.000 355 113 m*/ d. 314159 ok