Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 2015
-
29 juin 2005 à 17:04
cs_GoldenEye
Messages postés527Date d'inscriptionvendredi 14 septembre 2001StatutMembreDerniè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;
cs_GoldenEye
Messages postés527Date d'inscriptionvendredi 14 septembre 2001StatutMembreDernière intervention 6 octobre 20084 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