Question

Note: Je l'ai déjà lu ce sujet , mais Je ne comprends pas et il ne fournit pas une solution que je pourrais utiliser. Je suis horrible avec des problèmes de nombre.

Qu'est-ce qu'un moyen simple de générer Pi à ce que le nombre de décimales un utilisateur veut? Ce n'est pas pour les devoirs, juste essayer de compléter certains des projets énumérés ici:

lien

Était-ce utile?

La solution

Un algorithme classique pour le calcul des chiffres de pi est l'algorithme Gauss-Legendre. Bien qu'il ne soit pas aussi vite que certains des algorithmes plus modernes, il a l'avantage d'être compréhensible.

Soit

a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1

Ensuite

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

Ensuite

pi =. (a_n + b_n)^2 / (4 * t_n)

Ici (=. signifie « à peu près égale à ») Cet algorithme présente une convergence quadratique (le nombre de décimales correctes double à chaque itération).

Je vous laisse traduire cela en C #, y compris la découverte d'une bibliothèque arithmétique de précision arbitraire.

Autres conseils

Le sujet que vous parlez calculer la valeur de PI en utilisant la série taylor. En utilisant la fonction « double F (int i) » écrit sur ce sujet vous donnera la valeur de PI après les termes « i ».

Ce mode de calcul PI est un peu lent, je vous suggère de regarder le ici obtenir le PI au calculate n e chiffre.

Bonne chance!

Si vous regardez attentivement dans ce très bon guide:

modèles pour la programmation parallèle : Comprendre et appliquer les modèles parallèles avec le .NET Framework 4

Vous trouverez à la page 70 cette mise en œuvre mignonne (avec des modifications mineures de mon côté):

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top