C# :: Aufgabe #38

3 Lösungen Lösungen öffentlich

Laufzeit-Berechnung von PI mittels BBP-Reihe

Anfänger - C# von Sone - 05.01.2013 um 00:10 Uhr
Berechnen Sie PI mit der Bailey-Borwein-Plouffe-Formel (BBP-Reihe).

Extrahieren Sie dazu aus der Standardeingabe die Größe der Summenformel (im Wikipedia-Artikel: Das k) und berechnen Sie dann PI mit der Genauigkeit eines long double (und speichern Sie es selbstverständlich auch in einem).

Anschließend geben Sie die von ihnen berechnete Annäherung und die prozentuale Abweichung vom "echten", vor-berechneten PI an.

Lösungen:

vote_ok
von eulerscheZhl (5120 Punkte) - 12.12.2014 um 09:03 Uhr
Quellcode ausblenden C#-Code
using System;

namespace trainYourProgrammer
{
	class MainClass
	{
		public static decimal calcPi(int n) {
			decimal factor = 1; //das wird 1/16^k, erspart die Verwendung von Pow (was langsam ist und ein double liefert)
			decimal pi = 0;
			for (int k = 0; k <= n; k++) {
				pi += factor * (4 / (8 * k + 1m)
				                - 2 / (8 * k + 4m)
				                - 1 / (8 * k + 5m)
				                - 1 / (8 * k + 6m));
				factor /= 16;
			}
			return pi;
		}

		static void Main(string[] args)
		{
			Console.Write ("Berechnung von Pi mittels unendlicher Reihe bis k = ");
			int n = (int.Parse (Console.ReadLine ()));
			decimal realPi = 3.14159265358979323846264338327950m;
			decimal myPi = calcPi (n);
			Console.WriteLine ("errechnetes Pi: " + myPi);
			Console.WriteLine ("Abweichung: " + (realPi - myPi) / realPi * 100 + "%");
		}
	}
}
vote_ok
von niknik (1230 Punkte) - 13.08.2015 um 12:10 Uhr
Bisschen Umwandlung-Overkill, aber VS hat mich richtig lange genervt, so dass ich einfach alles umgewandelt habe bis es funktioniert hat.

Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PIBerechnung
{
    class Program
    {
        static void Main(string[] args)
        {
            long number;
            do
            {
                Console.WriteLine("Wie genau soll PI berechnet werden?");
                Console.WriteLine("Geben sie das k für die Bailey-Borwein-Plouffe-Formel an: ");
            } while (!long.TryParse(Console.ReadLine(), out number));

            if (number > 20)
            {
                number = 20;    // ab number = 20 ändert sich das ergebnis und die abweichung 
                                // - aufgrund der nicht-ausreichenden Genauigkeit von decimal und double - 
                                // nicht mehr
                                // ==> Setze auf 20 zur Perfomanceverbesserung
            }

                decimal result = 0;
                decimal zwischen1, zwischen2, zwischen3, zwischen4, zwischen5;
                int achtMalK;

                for (int k = 0; k <= number; k++)
                {
                    achtMalK = 8 * k;
                    zwischen1 = (decimal)((1 / Math.Pow(16, k)));
                    zwischen2 = (decimal)((decimal)4 / ((decimal)achtMalK + (decimal)1));
                    zwischen3 = (decimal)((decimal)2 / ((decimal)achtMalK + (decimal)4));
                    zwischen4 = (decimal)((decimal)1 / ((decimal)achtMalK + (decimal)5));
                    zwischen5 = (decimal)((decimal)1 / ((decimal)achtMalK + (decimal)6));

                    result += zwischen1 * (zwischen2 - zwischen3 - zwischen4 - zwischen5);
                }


                Console.Clear();
                decimal abweichung = (decimal)(Math.Abs((((decimal)Math.PI - result) / (decimal)Math.PI))) * 100;

                Console.WriteLine(number);
                Console.WriteLine("Dein Ergebnis:          {0}", result);
                Console.WriteLine("Richtiges Ergebnis:     {0}", Math.PI);
                Console.WriteLine("Prozentuale Abweichung: {0}%", abweichung);

                Console.ReadLine();
        }
    }
}
vote_ok
von stbehl (1530 Punkte) - 05.02.2018 um 15:26 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TrainYourProgrammer38
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Berechnung von Pi mit einer genauigkeit von k= ");
            double pi = 0;
            int genauigkeit = Convert.ToInt32(Console.ReadLine());
            for (int i = 1; i <= genauigkeit; i++)
            {
                pi += 1 / Math.Pow(16, i) * 4/(8*i+1) - 2/(8*i+4) - 1/(8*i+5) - 1/(8*i+6);
            }

            double berechnetPi = Math.PI;
            double abweichung = (berechnetPi - pi) / berechnetPi * 100;
            Console.WriteLine("berechnetes PI: " + pi);
            Console.WriteLine("Genauigkeit zum richtigen PI: " + abweichung + "%");
            Console.ReadKey();
        }
    }
}