Probleme dans prog de calcul de PI

Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 - 29 juin 2005 à 17:04
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 - 30 juin 2005 à 10:37
Bonjour tout le monde,
J'ai un petit programme basic pour calculer PI en utilisant la formule de Ramanujan:

1 2^(3/2) inf (4n)! (1103+26390n)
-- = ------- SUM -------------------------
pi 9801 n=0 (n!)^4 (396)^(4n)

Le problème c'est que quand j'augmente N à partir de N=43 je n'arrive pas à avoir un résultat. Pour N=42 j'arrive à avoir une precision seulement sur le sixième chiffre après la virgule. Comment est ce que je peux améliorer mon prog svp.
Voici mon code source:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


double factoriel(long int N)
{
if(N<=1)
return 1;
else
return(N*factoriel(N-1));
}
int main(int argc, char *argv[])
{
long double piapp;
long int N;
long int i;


piapp=0.0;
N=42;
for(i=0;i<=N;i++)
{


piapp+= (sqrt(8.0)/9801.0)*((factoriel(4*i)*1103.0+26390.0*i)/((factoriel(i)*factoriel(i)*factoriel(i)*factoriel(i)*exp(4.0*i*log(396.0)))));
}
printf("PI=%0.8lf\n",exp(-1.0*log(piapp)));
system("PAUSE");
return 0;
}
Jarod_Delaware

1 réponse

cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
30 juin 2005 à 10:37
La précision des long double est limitée ce pourquoi à partir d'un certain nombre d'itérations le résultat est faux (tes mises à la puissance 4^n, ta division etc... sont tronquées)


Afin de garantir que la N ième décimale soit juste pour P itérations (N et P pouvant être très grands), tu dois utiliser une structure plus précise que les long double (qui doivent tenir sur un petit nombre d'octets, 64 je crois) afin d'éviter les troncatures.
Pour cela tu dois définir ta propre structure de nombres sous la forme d'un grand tableau de M chiffres (1000 par exemple) et rééecrire les opérations de base (multiplication, addition, etc...)
De cette manière tu seras sûr d'avoir la précision voulue, fonction de N,M et P

Optimiser, c'est bien, déboguer c'est mieux
0
Rejoignez-nous