Calcul de PI, optimisation 64 bits
Bonjour,
Tout d'abord j'espère être sur le bon forum. Ensuite, petite explication de mon code .... tout simple .... calculer PI ..... avec une précision raisonnable ...... disons 2^20 digits par ex 8O (oui oui 1 millions de chiffres après la virgule)
En réalité, le but pour moi, c'est la manipulation de chiffre en virsule flottantes avec une grande précision (au moins 2^10 chiffres après la virgule)
Mais aussi et surtout me familiariser avec la compilation pour une archi 64bits.
Pour avoir un but, je me suis mis en tête de faire un équivalent Linux à SuperPI.
Bien qu'un équivalent existe, celui ci n'utilise qu'un seul core (et compiler en 32bits).
Passons au choses sérieuses. Pour l'algorithme, j'ai décidé de prendre celui de Gauss–Legendre (celui utilisé par ex par le logiciel Windows SuperPI)
J'ai réussi à compiler l'algorithme. Par contre, la précision est rédicule 16chiffres après la virgule :oops:
Voici la boucle de calcul et la déclaration des variables
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
double an,bn,tn,pn,an1,bn1,tn1,pn1,pi;
double tmp;
int i,prec;
...
{
/* Calcul de PI */
an1=(an+bn)/2;
bn1=sqrt(an*bn);
tmp=((double)(an)-(double)(an1));
tmp=(double)(tmp)*(double)(tmp);
tn1=(double)(tn)-(double)(pn)*(double)(tmp);
pn1=2*pn;
pi=((an1+bn1)*(an1+bn1))/(4*tn1);
/* Calcul de la précision */
tmp=an1-bn1;
prec=0;
do
{
tmp*=10;
prec++;
} while (tmp<1);
printf("pi : %.50lf\n",pi);
an=an1;
bn=bn1;
tn=tn1;
pn=pn1;
i++;
} |
Passer 3 itérations, la valeur de pi ne change plus :(
Je pense que cela provient du fait que mes double n'ont pas une précision suffisante. Et pour enfoncer le clou, j'imagine qu'il va me falloir reprogrammer les fonctions de calcul des multiplications, de racine carré et autre non ?
Mais pour l'instant, j'aimerais savoir comment manipuler des float avec une précision gigantesques ;)
Merci pour votre aide