` FILE:    sin.x
` PURPOSE: approximate sin(x) with x - x^3/6 + x^5/120 - ...
` USAGE:   >> xcom x/sin.x        (from MATLAB command line)
`          result := sin := x     (in X source)

  ` -------- normalize argument x -------------------
  if xin < 0.0 ? xa := -xin; :: xin >= 0.0 ? xa := xin; fi; 

  pi2 := 2.0*3.141592653589793;
  cut := 7.0;
  if xa > cut ?      ` get x into reasonable range
     red := r2i(xa/pi2)-1;
     xa  := xa - i2r(red)*pi2;
  :: xa <= cut ?     ` do nothing
  fi;
  xi := xa;          ` x^i
  x2 := xi*xi;       ` x^2

  ` --------- set up iteration ----------------
  i   := 0.0;        ` i
  sum := 0.0;        ` running sum
  fac := 1.0;        ` i!
  del := 1.0;        ` get started
  sg  := 1.0;        ` sign

  ` ---------- sum series -------------------
  do del > 0.0000001 ?
    del := xi/fac;   ` non-negative increment
    sum := sum + sg*del;
    sg  := -sg;      ` alternate sign
    i   := i+2.0;    ` step 2
    fac := fac*i*(i+1.0);
    xi  := xi*x2;    ` mul by x^2
  od;

  ` ------- normalize result sin(-x) = -sin(x) ------------
  if xin < 0.0 ? xout := -sum; :: xin >= 0.0 ? xout := sum; fi