Versuchen, zu berechnen Pi auf N Dezimalstellen mit C#
Frage
Hinweis:Ich habe schon gelesen dieses Thema,, aber ich verstehe es nicht, und es nicht bieten eine Lösung, die ich verwenden könnte.Ich bin schrecklich mit Zahl-Probleme.
Was ist eine einfache Möglichkeit zum generieren von Pi, was die Anzahl der Dezimalstellen ein Benutzer möchte?Dies ist nicht für die Hausaufgaben, nur versucht, um einige der Projekte, die hier aufgelistet:
Lösung
Ein klassischer Algorithmus für die Berechnung der Ziffern von pi
ist die Gauss-Legendre-Algorithmus.Es ist zwar nicht so schnell wie einige der moderneren algorithmen, es hat den Vorteil, dass Sie verständlich.
Lassen Sie
a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1
Dann
a_(n+1) = (a_n + b_n) / 2
b_(n+1) = Sqrt(a_n * b_n)
t_(n+1) = t_n - p_n * (a_n - a_(n+1))^2
p_(n+1) = 2 * p_n
Dann
pi =. (a_n + b_n)^2 / (4 * t_n)
Hier (=.
bedeutet "ungefähr gleich") Dieser Algorithmus Exponate quadratische Konvergenz (die Anzahl der korrekten Dezimalstellen verdoppelt sich mit jeder iteration).
Ich werde es verlassen, um Sie zu übersetzen dies in C#, einschließlich der Entdeckung eine beliebige Präzision arithmetische Bibliothek.
Andere Tipps
Das Thema Ihrer reden berechnen Sie den Wert von PI mit Hilfe der taylor-Reihe.Mit der Funktion "double F (int i)", schrieb zu diesem Thema geben Sie den Wert von PI nach dem "ich" Begriffen.
Diese Art der Berechnung von PI ist eine Art von langsam, ich schlage vor, Sie betrachten die PI-fallen Algorithmus.
Sie können auch eine Umsetzung hier erhalten das berechnen von PI der n-TEN Ziffer.
Viel Glück!
Wenn Sie einen genauen Blick in diesen wirklich guten guide:
Finden Sie auf Seite 70 dieses nette Umsetzung (mit geringen änderungen von meiner Seite):
static decimal ParallelPartitionerPi(int steps)
{
decimal sum = 0.0;
decimal step = 1.0 / (decimal)steps;
object obj = new object();
Parallel.ForEach(Partitioner.Create(0, steps),
() => 0.0,
(range, state, partial) =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
decimal x = (i + 0.5) * step;
partial += 4.0 / (1.0 + x * x);
}
return partial;
},
partial => { lock (obj) sum += partial; });
return step * sum;
}