public Complex64 Power(Complex64 y) { double c = y.real; double d = y.imag; int power = (int)c; if (power == c && power >= 0 && d == .0) { Complex64 result = new Complex64(1.0); if (power == 0) { return(result); } Complex64 factor = this; while (power != 0) { if ((power & 1) != 0) { result = result * factor; } factor = factor * factor; power >>= 1; } return(result); } else if (IsZero) { return(y.IsZero ? Complex64.MakeReal(1.0) : Complex64.MakeReal(0.0)); } else { double a = real; double b = imag; double powers = a * a + b * b; double arg = Math.Atan2(b, a); double mul = Math.Pow(powers, c / 2) * Math.Pow(Math.E, -d * arg); double common = c * arg + .5 * d * Math.Log(powers, Math.E); return(new Complex64(mul * Math.Cos(common), mul * Math.Sin(common))); } }