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:

Link

War es hilfreich?

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:

Muster für Parallele Programmierung:Verstehen und Anwenden von Parallelen Mustern mit der .NET Framework 4

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top