2010-02-09 11 views
1

Note: J'ai déjà lu this topic, mais je ne le comprends pas et il ne fournit pas une solution que je pourrais utiliser. Je suis terrible avec les problèmes de nombre.Essayer de calculer Pi à N nombre de décimales avec C#

Quel est un moyen simple de générer Pi à quel 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:

Link

+0

c'est un double de nombreuses questions. –

+0

Je n'ai trouvé que celui que j'ai relié en haut. Y a-t-il un autre qui montre une solution porper? –

+0

http://stackoverflow.com/questions/19/fastest-way-to-get-value-of-pi –

Répondre

5

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

Laissez

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

Puis

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 

Puis

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 le soin de traduire cela en C#, y compris en découvrant une bibliothèque arithmétique de précision arbitraire.

2

The topic your talking about 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 "i" termes.

Cette façon de calculer PI est plutôt lente, je vous suggère de regarder le PI fast algorithm.

Vous pouvez également trouver une implémentation here qui obtient l'IP de calcul au nième chiffre.

Bonne chance!

1

Si vous jetez un coup d'oeil étroit dans ce très bon guide:

Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .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; 
} 
+0

Cela ne renvoie que la précision décimale, pas une précision arbitraire. –

Questions connexes