C# :: Aufgabe #38 :: Lösung #2

3 Lösungen Lösungen öffentlich
#38

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.
#2
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();
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben