Je fais un programme qui s'appelle approximativement PI et j'essaye d'utiliser longtemps, mais ça ne marche pas. Voici le code
#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
num pi;
pi=0;
num e, n;
scanf("%d", &n);
for(e=0; 1;e++){
pi += ((pow((-1.0),e))/(2.0*e+1.0));
if(e%n==0)
printf("%15lld -> %1.16lld\n",e, 4*pi);
//printf("%lld\n",4*pi);
}
}
%lld
est la méthode C99 standard, mais cela ne fonctionne pas sur le compilateur que j'utilise (mingw32-gcc v4.6.0). La façon de le faire sur ce compilateur est la suivante: %I64d
Alors essayez ceci:
if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);
et
scanf("%I64d", &n);
Le seul moyen que je connaisse pour le faire de manière totalement portable consiste à utiliser les définitions de <inttypes.h>
.
Dans votre cas, cela ressemblerait à ceci:
scanf("%"SCNd64"", &n);
//...
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);
C'est vraiment très moche ... mais au moins c'est portable.
scanf()
doit également utiliser %lld
.Il y a beaucoup trop de parenthèses et beaucoup trop peu d'espaces dans l'expression
pi += pow(-1.0, e) / (2.0*e + 1.0);
int
pour main()
.int main(void)
quand il ignore ses arguments, bien que ce soit moins une déclaration catégorique que le reste.main()
et ne l'utilise pas moi-même; J'écris return 0;
Pour être explicite.Je pense que tout l'algorithme est douteux lorsqu'il est écrit avec long long
; le type de données devrait probablement ressembler davantage à long double
(avec %Lf
pour le format scanf()
, et peut-être %19.16Lf
pour le printf()
formats.