( Floating point stuff)

: FLOAT DPL @ 0 >= IF FREAL ELSE FINT ENDIF ;  ( -1 DPL ! in FREAL word )

5 FLD !      ( no. chars after dec pt )

: 10^n  FINT 10 FINT SWAP FPOW ;  ( n ... fp 10^n)


: power10 FLD @ 10^n ;        ( 10^FLD)

: E.    ( floating point no ..... )  ( printed in E format)
 DECIMAL
 FPDECODE FE10          ( sign,exponent,mantissa...)  ( base=10)
 ROT -1 = IF ." -" ELSE SPACE ENDIF
 power10              ( 10^FLD)
 F* FIX             ( mantissa - no dec pt yet)
 <#
 FLD @ 0 DO # LOOP
 46 HOLD #S #> TYPE  ( print mantissa with sign & dec pt)
 ." E" FIX .         ( print exponent)
;

: F.   ( fp no .... )  ( printed in standard format if not too big)
 DECIMAL DUP FABS 10000 FINT F>
 IF E.
 ELSE
  FPDECODE FE10            ( sign,exponent,mantissa...)  ( base=10)
  SWAP [ 10 FLOAT ] LITERAL SWAP FPOW  ( sign, mantissa, 10^ exponent...)
  F*                       ( sign, mantissa*10^exponent...)
  power10                  ( 10^FLD)  ( adjust for # chars)
  F*                       ( sign, adjusted result...)
  [ 0.5 FLOAT ] LITERAL F+    ( rounding adjustment)
  FIX SWAP F0= IF SPACE  ELSE ." -"    ENDIF     ( -ve no? )
  <# FLD @ 0 DO # LOOP
  46 HOLD #S #> TYPE
 ENDIF
;

: E^  FLOAT INTERPRET 10^n F* ;

3.14159265 FLOAT CONSTANT Pi

: 2*PI Pi 2 FINT F* ;
: PI/2 Pi 2 FINT F/ ;

: F+! ( n,addr ...)
   DUP @ ROT F+ SWAP ! ; 

: FMAX 2DUP F> IF DROP ELSE SWAP DROP ENDIF ;
: FMIN 2DUP F< IF DROP ELSE SWAP DROP ENDIF ;

: FSIGN  ( n,x ... sign{n}*abs{x})
   FABS SWAP 0< IF FMNF THEN ;

: Fconfine ROT FMIN FMAX ;  ( fn1,flo,fhi...fn)