2010-03-18 5 views
0

J'ai essayé d'écrire le programme suivant en C# pour calculer pi en utilisant la récursion infinie, mais je continue de me tromper sur la division entière/double/décimale. Je n'ai vraiment aucune idée de pourquoi cela ne fonctionne pas, alors pardonnez-moi pour mon manque de compréhension des choses fortement typées, car j'apprends encore C#.Calcul de pi à l'aide de séries infinies en C#

Merci d'avance!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public static int Main(string[] args) 
     { 
      int numeratornext = 2; 
      int denominatornext = 5; 

      decimal findto = 100.0M; 
      decimal pi = 0.0M; 
      decimal halfpi = 1.0M; 
      int seriesnum = 1; 
      int seriesden = 3; 

      for (int i = 0; i < findto; i++) 
      { 
       halfpi += Decimal.Divide((decimal)seriesnum, (decimal)seriesden); 
       //System.Console.WriteLine(Decimal.Divide((decimal)seriesnum, (decimal)seriesden).ToString()); 
       seriesnum *= numeratornext; 
       seriesden *= denominatornext; 
       numeratornext++; 
       denominatornext += 2; 
      } 

      pi = halfpi * 2; 

      System.Console.WriteLine(pi.ToString()); 
      System.Console.ReadLine(); 
      return 0; 
     } 
    } 
} 
+0

Vous allez rencontrer des problèmes rapidement sauf si le type décimal est précision infinie parce que vous manquerez de chiffres. – staticsan

+1

"récursivité infinie" aura presque certainement besoin d'une pile de taille infinie. Je ne suis pas au courant, de prime abord, de toute architecture qui supporte ceci :-) – paxdiablo

+0

Vous pourriez envisager d'accéder à cette page web en code pour "récolter" pi jusqu'à un million de chiffres. Ou cet article a du code C#: http://www.omegacoder.com/?p=91 – BillW

Répondre

0

Votre confusion vient du fait que vous utilisez int et decimal, toutes deux sont mieux adaptés pour les entiers ou les calculs financiers précision fixe. Ma suggestion serait simplement de déclarer tous vos de vos variables numériques comme double ici, ce qui supprimera toute ambiguïté sur les types de vos valeurs de retour, puisque toute opération mathématique sur deux doubles entraîne un autre double.

(En dehors de cela, votre algorithme est erroné. Cependant, la fausseté de votre algorithme est une question distincte des types que vous utilisez.)

+0

En regardant depuis plus d'un an, j'ai peur de ne pas pouvoir répondre à cette question car je ne me souviens pas de ce que j'essayais de faire. Merci pour l'aide, de toute façon. –

+0

@Jonathan, woah. Je n'avais même pas réalisé que c'était une vieille question. Il est apparu sur la page active pour une raison quelconque et j'ai répondu et jamais même regardé la date. –