Exemple #1
0
        public static double Sqrt(double x)
        {
            if (x < 0)
            {
                throw new ArgumentException("");
            }
            int count = 0;
            int a     = 2;

            for (int i = 308; i > -15; i -= 2)
            {
                double b = x / PowI(10, i);
                if (b >= 1 && b < 10)
                {
                    count = i / 2;
                    break;
                }
                else if (b >= 1 && b >= 10)
                {
                    count = i / 2;
                    a     = 6;
                    break;
                }
            }
            double y   = a * PowI(10, count);
            double x_n = (y + x / y) / 2.0;
            double tol = PowI(10, -12);

            while (1000 * Simple.Abs(y - x_n) >= tol)
            {
                y   = x_n;
                x_n = (y + x / y) / 2.0;
            }
            return(y);
        }
Exemple #2
0
        public static double Pow(double x, double y)
        {
            if (y - (int)(y) == 0)
            {
                return(PowI(x, (int)(y)));
            }
            else if (x < 0 && (1 / y) % 2 == 0)
            {
                throw new ArgumentException("Imaginary number!");
            }
            double answer = PowI(Simple.Abs(x), (int)(y));
            double value  = (Abs(y) - (int)(Abs(y))) * 10;
            int    count  = 1;

            while (value > 0)
            {
                answer *= Exp((int)(value) * Ln(Simple.Abs(x)) / PowI(10, count));
                value  -= (int)(value);
                value  *= 10;
                count  += 1;
            }
            if (x < 0)
            {
                return(0 - answer);
            }
            return(answer);
        }
Exemple #3
0
        public static double Sin(double x)
        {
            if (x == 0)
            {
                return(0);
            }
            else if (Simple.Abs(2 * x / pi - 3) % 4 == 0)
            {
                return(-1);
            }
            else if (Simple.Abs(2 * x / pi - 3) % 4 == 2)
            {
                return(1);
            }
            else if (Simple.Abs(x) % pi == 0)
            {
                return(0);
            }
            double y = x;

            if (x < 0)
            {
                y = Math.Round(0 - x / (2.0 * pi)) * 2.0 * pi + x;
            }
            double mod = y % (2.0 * pi);

            if (mod > pi / 2.0 && mod < pi)
            {
                y = pi - y;
            }
            else if (mod > pi && mod < 3.0 * pi / 2.0)
            {
                y -= pi;
            }
            else if (mod > 3.0 * pi / 2.0)
            {
                y = 2.0 * pi - y;
            }
            double x_n    = y;
            UInt64 fact   = 1;
            double answer = y / (1.0 * fact);

            for (int i = 1; i < 19; i += 2)
            {
                x_n    *= y * y;
                fact    = fact * (UInt64)((i + 1) * (i + 2));
                answer += Simple.Pow(-1, (int)((i + 1) / 2)) * x_n / (1.0 * fact);
            }
            if (mod > pi)
            {
                return(0 - answer);
            }
            return(answer);
        }
Exemple #4
0
        public static double Arccos(double x)
        {
            if (x < -1 || x > 1)
            {
                throw new ArgumentException("Can't compute!");
            }
            else if (x == -1)
            {
                return(0 - pi / 2.0);
            }
            else if (x == 1)
            {
                return(pi / 2.0);
            }
            else if (x == 0)
            {
                return(0.0);
            }
            double y  = Simple.Abs(x);
            double x1 = pi / 2.0;
            double x2 = 0;
            double xm = pi / 4.0;
            double y2 = 0.0;

            while (y2 > Simple.Abs(x) + 0.000000000000001 || y2 < Simple.Abs(x) - 0.000000000000001)
            {
                double y1 = Cos(x1);
                y2 = Cos(x2);
                double ym = Cos(xm);
                double m1 = (xm - x1) / (ym - y1);
                double m2 = (x2 - xm) / (y2 - ym);
                if (y > y1 && y < ym)
                {
                    x2 = m1 * (y - y1) + x1;
                }
                else if (y > ym && y < y2)
                {
                    x2 = m2 * (y - ym) + xm;
                }
                xm = (x1 - x2) / 2.0 + x2;
            }
            if (x < 0)
            {
                return(pi - x2);
            }
            return(x2);
        }