Bonjour je dois calculer une valeur approchée de pi en utilisant le polynome de chebyshev (http://pi314.net/fr/methana.php) en répéant la somme par 10 000 000 itérations.
Mon programme devra ensuite être utiliser le multhreading (1,2,4 ou 8), je l'ai d'abord implanté en séquentiel en gardant à l'idée qu'il doit être adapté.
Voici le code :
Mon problème : Avec des double j'obtiens une valeur 3.96XXXXXXXXX, toujours le même résultat peu importe le nombre d'itérations.
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
36
37
38
39
40
41
42
43
44 int main() { std::uint64_t iteration = 10000000; std::cout.precision(10); // Suite U ------------------------------------------------------------------ long double *suiteU = new long double[2*iteration]; suiteU[1] = 99.0/100.L; suiteU[2] = 4801.0/5000.L; for(std::uint64_t i=3;i<2*iteration;i++) { suiteU[i] = (99.L/50.L) * suiteU[i-1] - suiteU[i-2]; } // Suite V ------------------------------------------------------------------ long double *suiteV = new long double[2*iteration]; suiteV[0] = 99.L/4780.L; suiteV[1] = -11414399.L/11424200.L; for(std::uint64_t i=3;i<2*iteration;i++) { suiteV[i] = (99.L/2390.L) * suiteV[i-1] - suiteV[i-2]; } // Calcul de PI ------------------------------------------------------------- long double pi; for (std::uint64_t i = 1; i<=iteration;i++) { pi += (std::pow(-1,i-1) / (std::pow(10,2*i-1) * (2*i-1))) * (4.L*suiteU[2*i-1]-suiteV[2*i-1]); } std::cout << 8*pi; return 0; }
Je me suis donc dit que les double n'étaient pas assez précis pour les valeurs que je calcule.
Cependant avec des long double j'obtiens la valeur "nan" pour pi...
Je ne sais donc plus du tout comment faire, pourriez vous m'aiguiller ?
Merci de m'avoir lu, bonne soirée.
Teebus
Partager