A JavaScript complex number class

The complex number class definition:  cx.js


class cx

var c = new cx(x, y[, polar]); // returns a new complex number object:
                               //   x + yi, or x cis y if polar is true

properties: // these all return real numbers; read-write
c.re        // real part
c.im        // imaginary part
c.abs       // absolute value (radius)
c.arg       // argument (angle)

static property:
cx.i // returns a complex number object 0 + 1i; read-only

c.toString([polar])         // returns "x + yi" or "x cis y"; output defaults to the former
c.toPrecision(n[, polar])   // returns the same, to n significant figures
c.toPrecis(n[, polar])      //     "             to n significant figures, without trailing zeros
c.toFixed(n[, polar])       //     "             to n decimal places
c.toExponential(n[, polar]) //     "             to n decimal places in scientific notation

static methods:        // these all return a new cx unless otherwise noted

cx.conj(c)             // conjugate of c
cx.neg(c)              // negative c

cx.add(c, d)           // c + d; c or d may be simple or complex
cx.sub(c, d)           // c - d;         "
cx.mult(c, d)          // c * d;         "
cx.div(c, d)           // c / d;         "

cx.pow(c, int)         // c to the int power; int is an integer >= 0
cx.root(c, int[, k])   // c to the int root; int is an integer >= 2;
                       //   k is an integer 0 <= k <= int-1 for each of the roots (default 0)
cx.log(c)              // natural logarithm (base e) of c
cx.exp(c)              // e to the power of c

cx.sin(c)              // the trigonometric functions and their inverses
cx.asin(c[, k])        // k = 0 or 1 for each of the square roots in the equation (default 0)
cx.acos(c[, k])        // k = 0 or 1  "
cx.sinh(c)             // the hyperbolic functions and their inverses
cx.asinh(c[, k])       // k = 0 or 1 for each of the square roots in the equation (default 0)
cx.acosh(c[, k])       // k = 0 or 1  "

cx.copy(c)             // returns a new cx with the same real and imaginary parts as c
cx.eq(c, d[, epsilon]) // returns true if the real and imaginary parts are equal,
                       //   or the difference less than the (optional) epsilon value

call one of these after the class definition:
cx.degrees(false); // input and output will use radians
cx.degrees(true);  // input and output will use degrees

Some derived functions and miscellany:

c-a/b = cx.div(1, cx.pow(cx.root(c, b, k), a))
logb(c) = cx.div(cx.log(c), Math.log(b))
ac = cx.exp(cx.mult(c, Math.log(a)))

typeof c = "object"
c instanceof cx = true

Try it yourself; enter code into the first field below, then an expression to be evaluated into the second, and press calculate.  (Note:  if you write an infinite loop or other bad code, you may crash your browser.)