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(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
Voici la boucle de calcul et la déclaration des variables
Passer 3 itérations, la valeur de pi ne change plus
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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++; }
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
Partager