( Complex) ( all f.p.)

( Utilities)
: zconj  FMNF ;        ( a,b.... a,-b )
: zDROP  2DROP ;       ( a,b .... )
: zSWAP  2SWAP ;       ( a,b,c,d ... c,d,a,b)
: zDUP   2DUP ;        ( a,b ... a,b,a,b)
: zOVER  4 PICK 4 PICK ;  ( a,b,c,d ... a,b,c,d,a,b)

: zVARIABLE <BUILDS SWAP , , DOES> ;   ( a,b ...)
: z@  DUP @ SWAP 4+ @ ;                ( addr ... a,b)
: z!  DUP 4+ ROT SWAP ! ! ;            ( a,b,addr ... )

( test data)
: Pi/2 Pi 2 FINT F/ ;
: Pi/4 Pi/2 2 FINT F/ ;
10 FLOAT 30 FLOAT zVARIABLE z1
50 FLOAT 25 FLOAT zVARIABLE z2   

( Arithmetic operations now follow)
: rad->deg 180 FINT F* Pi F/ ;  ( radians ... degrees)
: deg->rad Pi F* 180 FINT F/ ;  ( degrees ... radians)

: a+ib->r,th  ( a,b....r,theta) 
  zDUP
  DUP F* SWAP DUP F* F+ FSQT    ( a,b,r ....)
  ROT ROT FPOL ;                ( .....r,theta)

: r,th->a+ib    ( r,theta .... a,b)
  zDUP FSIN F*  ( r,th,rSintheta)
  ROT ROT FCOS F* SWAP ; ( ..... a,b)

: z+  ROT F+ ROT ROT F+ SWAP ;        ( a,b,c,d .... a+c,b+d)
: z-  ROT SWAP F- ROT ROT F- SWAP ;   ( a,b,c,d .... a-c,b-d)

: z*f ( a,b,f ... fa,fb)      ( scalar multiplication)
   DUP ROT F*            ( a,f,fb ...)
   ROT ROT F*            ( fb,fa ...)
   SWAP ;                ( fa,fb ...)

: z/f  ( a,b,f .... a/f,b/f)  ( scalar division)
   1 FINT SWAP F/   ( a,b,1/f ...)
   z*f ;

: z1*z2   ( a,b,c,d .... ac-bd,ad+bc)
   zOVER  ( a,b,c,d,a,b ...)
   zconj  ( a,b,c,d,a,-b ...)
   SWAP   ( a,b,c,d,-b,a ...)   
   ROT    ( a,b,c,-b,a,d ...)
   z*f    ( a,b,c,-bd,ad ...)
   >R >R  ( a,b,c ...)
   z*f    ( ac,bc ...)
   R> R>  ( ac,bc,-bd,ad ...)
   z+ ;   ( ac-bd,ad+bc ...)  

( words for complex division)
: ->r^2  ( a,b ... a^2 + b^2)
  DUP F* SWAP DUP F* F+ ;

: 1/z    ( a,b .... c,d)
  zconj zDUP ->r^2   ( a,-b,r^2 ...)
  DUP F0= IF ." Can't divide by zero" ABORT ENDIF
  z/f ;

: z1/z2    ( a,b,c,d ... e,f)
  1/z z1*z2 ;





 

