web-dev-qa-db-fra.com

Comment imprimer longtemps

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);
    }
}
49
Carlos

%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.

62
karadoc
  • Votre déclaration scanf() doit également utiliser %lld.
  • Votre boucle n'a pas de condition de fin.
  • 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);
    
  • Vous en ajoutez un à la première itération de la boucle, puis zéro à la valeur de 'pi'; cela ne change pas beaucoup la valeur.
  • Vous devez utiliser un type de retour explicite de int pour main().
  • Dans l’ensemble, il est préférable de spécifier int main(void) quand il ignore ses arguments, bien que ce soit moins une déclaration catégorique que le reste.
  • Je n'aime pas la licence explicite accordée dans C99 pour omettre le retour à partir de la fin de 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.

3
Jonathan Leffler