Hmm dans ce cas là je me suis planté, je parlais bien de l’optimisation par défaut sans aucun argument -O (bête réflexe, apparemment erroné : pas d’optimisation => -O0
).[/quote]
En fait O0 est une optimisation 
Ça dépend comment il cumule les résultats : accumulation séparément dans chaque thread puis accumulation des différents threads, ou bien accumulation synchronisée “au fil de l’eau” (forcément beaucoup moins efficace que l’autre alternative). Vu que j’ai jamais bossé avec OpenMP, je sais pas ce qu’il en est, mais j’imagine qu’il doit laisser le choix ?[/quote]
Ça n’a pas vraiment d’importance, tu lui demande de créer un thread de plus que ton nombre d’unité de calcul et chaque thread va incrémenter la variable quand il pourra. D’une certaine façon les calculs se feront de manière asynchrones.
Pour le bug, je pense que c’est un problème de dépassement de capacité des int donc, il suffit de mettre un unsigned lon pour arriver à 4294967296-1 comme limite (après ça deviens moins agréable à faire d’en gérer plus) :
[code]#include <stdio.h>
double MoinsUnPuissanceN(const int n);
inline double MoinsUnPuissanceN(const int n)
{
return (n&1) ? -1. : 1.;
}
void main()
{
unsigned long rang;
double p = 4;
while (scanf ("%d",&rang) == 0) getchar ();
for(unsigned long i = 1; i <= rang; ++i)
{
p += (MoinsUnPuissanceN(i) * 4.) / (2. * i + 1);
}
printf(“valeur approchée de pi au rang %d : %.10f\n”, rang, p);
}[/code]