Beispiel #1
0
        // Berechne die quadratwurzel aus q (Heronverfahren)
        //
        //         1    /       q   \
        // xn+1 = --- * | xn + ---- |
        //         2    \       xn  /
        // Each iteration about doubles the correct decimal places!
        public static VeryLong Sqrt(VeryLong input, int numberOfDigits)
        {
            int      additionalCalcDigits  = 5;
            int      additionalLimitDigits = 0;
            VeryLong limit = new VeryLong("0." + VeryLong.GetZeros(numberOfDigits + additionalLimitDigits) + "1"
                                          + VeryLong.GetZeros(additionalCalcDigits - additionalLimitDigits - 1));
            VeryLong xnew;
            VeryLong delta;
            VeryLong xn = new VeryLong(input.ToString());
            int      i  = 0;

            while (true)
            {
                VeryLong summand2 = input.DivideBy(xn, numberOfDigits + additionalCalcDigits);
                VeryLong factor   = xn.Add(summand2);
                xnew  = new VeryLong("0.5").Multiply(factor);
                delta = xnew.Subtract(xn);
                Console.WriteLine("i " + i);
                Console.WriteLine("Sqrt delta: " + delta.ToString());
                Console.WriteLine("limit:      " + limit.ToString());
                Console.WriteLine("Sqrt:       " + xnew.ToString());
                xn = xnew;
                i++;
                if (!delta.Abs().IsLargerOrEqual(limit))
                {
                    break;
                }
            }

            xn.LimitPrecisionTo(numberOfDigits);
            return(xn);
        }
Beispiel #2
0
        public static VeryLong Pi(int numberOfDigits)
        {
            VeryLong factor = new VeryLong(1.ToString());
            int      additionalCalcDigits  = 10;
            int      additionalLimitDigits = 0;
            VeryLong pi = new VeryLong("0");

            if (_piAlgorithm == PiAlgorithm.BBP)
            {
                pi = GetStartValueBBP(numberOfDigits + additionalCalcDigits); // BBP
            }
            else if (_piAlgorithm == PiAlgorithm.Euler)
            {
                pi = new VeryLong("3"); // Euler
            }

            VeryLong limit = new VeryLong("0." + VeryLong.GetZeros(numberOfDigits + additionalLimitDigits) + "1"
                                          + VeryLong.GetZeros(additionalCalcDigits - additionalLimitDigits - 1));
            int i = 0;

            StartTime();

            while (true)
            {
                i++;
                VeryLong term = new VeryLong("0");

                if (_piAlgorithm == PiAlgorithm.BBP)
                {
                    term = GetPiTermBBP(i, numberOfDigits + additionalCalcDigits, ref factor);
                }
                else if (_piAlgorithm == PiAlgorithm.Euler)
                {
                    term = GetPiTermEuler(i, numberOfDigits + additionalCalcDigits);
                }

                if (!term.IsLargerOrEqual(limit))
                {
                    Console.WriteLine("limit reached:");
                    Console.WriteLine("Term:  " + term.ToString());
                    Console.WriteLine("limit: " + limit.ToString());
                    PrintTime();
                    break;
                }

                if (_piAlgorithm == PiAlgorithm.BBP) // BBP
                {
                    pi = pi.Add(term);
                }
                else if (_piAlgorithm == PiAlgorithm.Euler)
                {
                    if (i % 2 == 1)
                    {
                        pi = pi.Add(term);
                    }
                    else
                    {
                        pi = pi.Subtract(term);
                    }
                }

                if (i % 10 == 0)
                {
                    Console.WriteLine();
                    Console.WriteLine("Term " + i);
                    Console.WriteLine("Pi:    " + pi.ToString());
                    Console.WriteLine("Term:  " + term.ToString());
                    Console.WriteLine("limit: " + limit.ToString());
                    PrintTime();
                }
                else if (i % 1 == 0)
                {
                    Console.Write(".");
                }
            }

            VeryLong piCorrectDigits = new VeryLong(pi.ToString().Remove(numberOfDigits + 2));

            return(piCorrectDigits);
        }