示例#1
0
        public static Complex Sqrt(Complex value)
        {
            if (value.IsRealNonNegative())
            {
                return new Complex((double)Math.Sqrt(value.Real), 0.0);
            }

            Complex result;

            var absReal = Abs(value.Real);
            var absImag = Abs(value.Imaginary);
            double w;
            if (absReal >= absImag)
            {
                var ratio = value.Imaginary / value.Real;
                w = Sqrt(absReal) * Sqrt(0.5 * (1.0 + Sqrt(1.0 + (ratio * ratio))));
            }
            else
            {
                var ratio = value.Real / value.Imaginary;
                w = Sqrt(absImag) * Sqrt(0.5 * (Abs(ratio) + Sqrt(1.0 + (ratio * ratio))));
            }

            if (value.Real >= 0.0)
            {
                result = new Complex(w, value.Imaginary / (2.0 * w));
            }
            else if (value.Imaginary >= 0.0)
            {
                result = new Complex((absImag / (2.0 * w)).Real, w);
            }
            else
            {
                result = new Complex((absImag / (2.0 * w)).Real, -w);
            }

            return result;
        }
示例#2
0
        public static Complex Ln(Complex c)
        {
            /*if (c.IsReal() && c < 0.0) return Ln(-c) + (Constants.I * Constants.Pi);
            if (c.IsReal()) return Quad.Log(c.Real);

            return Math.Log(c.Module, Constants.E) + (Constants.I * (Complex)c.Argument);*/

            if(c.IsRealNonNegative()) return new Complex(Math.Log(c.Real, Constants.E), 0.0);
            return new Complex(0.5 * Math.Log(c.MagnitudeSquared(), Constants.E), c.Argument);
        }