Esempio n. 1
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);
        }