according to thread:
User to user discussions about the PB/Win (formerly PB/DLL) product line. Discussion topics include PowerBASIC Forms, PowerGEN and PowerTree for Windows.


Code:
#COMPILE EXE
#DIM ALL
'
TYPE ComplexType
   r AS SINGLE
   i AS SINGLE
END TYPE
'
UNION uComplex
   Complex AS STRING*8
   ComplexType
END UNION
'
FUNCTION  Complex(A AS uComplex, Operator AS STRING ,OPT  B AS uComplex, OPT BYVAL  x AS SINGLE) AS STRING
  LOCAL c AS uComplex
  LOCAL real, im, den, w, r AS SINGLE
  '
  SELECT CASE UCASE$(Operator)
      CASE "+"
          c.r = a.r + b.r
          c.i = a.i + b.i
      CASE "-"
          c.r = a.r - b.r
          c.i = a.i - b.i
      CASE "*"
          c.r = a.r * b.r - a.i * b.i
          c.i = a.i * b.r + a.r * b.i
      CASE "/"
          IF (ABS(b.r) >= ABS(b.i)) THEN
              r = b.i / b.r
              den = b.r + r*b.i
              c.r = (a.r + r*a.i)/den
              c.i = (a.i - r*a.r)/den
          ELSE
              r = b.r / b.i
              den = b.i + r*b.r
              c.r = (a.r*r + a.i)/den
              c.i = (a.i*r - a.r)/den
          END IF
      CASE "CCONJ"
          c.r =  a.r
          c.i = -a.i
      CASE "SQR"
          IF ((A.r = 0.0!) AND (A.i = 0.0!)) THEN
              c.r = 0.0!
              c.i = 0.0!
          ELSE
              real = ABS(A.r)
              im = ABS(A.i)
              IF (real >= im) THEN
                  r = im/real
                  w = SQR(real) * SQR(0.5! * (1.0! + SQR(1.0! + r*r)))
              ELSE
                  r = real/im
                  w = SQR(im) * SQR(0.5! * (r + SQR(1.0! + r*r)))
              END IF
              IF (A.r >= 0.0!) THEN
                  c.r = w
                  c.i = A.i / (2.0! * w)
              ELSE
                  c.i = IIF(A.i >= 0,  w,  -w )
                  c.r = A.i / (2.0! * c.i)
              END IF
          END IF
      CASE "RCMUL"
          c.r = x * a.r
          c.i = x * a.i
  END SELECT
  '
  FUNCTION = c.Complex
END FUNCTION
'
FUNCTION MakeComplex(real AS SINGLE, im AS SINGLE) AS STRING
    LOCAL c AS uComplex
    c.r = real
    c.i = im
    FUNCTION = c.Complex
END FUNCTION
'
FUNCTION Cabs(BYVAL z AS uComplex) AS SINGLE
  LOCAL real, im, result, temp AS SINGLE
    '
    real = ABS(z.r)
    im   = ABS(z.i)
    '
    IF (real = 0.0!) THEN
        result = im
    ELSEIF (im = 0.0!) THEN
        result = real
    ELSEIF (real > im) THEN
        temp = im/real
        result = real * SQR(1.0! + temp*temp)
    ELSE
        temp = real/im
        result = im * SQR(1.0! + temp*temp)
    END IF
    FUNCTION = result
END FUNCTION
'
'=====================  using  =======================
FUNCTION PBMAIN () AS LONG
  LOCAL a , b, c AS uComplex
  LOCAL ComplexABS AS SINGLE
  LOCAL s AS STRING
  '
  a.Complex = MakeComplex(1,2) ' make complex number. The same as: a.r=1 : a.i=2
  b.Complex = MakeComplex(3,4)
  '
  c.Complex = Complex(a,"+",b)   : s = "(1+2i) + (3+4i) = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  c.Complex = Complex(a,"-",b)   : s=s+"(1+2i) - (3+4i) = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  c.Complex = Complex(a,"*",b)   : s=s+"(1+2i) * (3+4i) = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  c.Complex = Complex(a,"/",b)   : s=s+"(1+2i) / (3+4i) = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  c.Complex = Complex(a,"Cconj") : s=s+"Conj(1+2i) = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  c.Complex = Complex(a,"SQR")   : s=s+"SQR(1+2i) = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  c.Complex = Complex(a,"RCmul",BYVAL 0,5) :s=s+"(1+2i) * 5 = "+FORMAT$(c.r,"#,.0##")+"+"+FORMAT$(c.i,"#,.0##")+"i"+$CRLF
  ComplexABS= Cabs(c.Complex)    : s=s+"Absolut value of (1+2i) = "+STR$(ComplexABS)
  '
  ? s,,"Complex number math:"
END FUNCTION