C# :: Aufgabe #38
3 Lösungen
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.
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:
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 + "%"); } } }
Bisschen Umwandlung-Overkill, aber VS hat mich richtig lange genervt, so dass ich einfach alles umgewandelt habe bis es funktioniert hat.
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(); } } }
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(); } } }