49 votes

Comment imprimer longtemps

Je fais un programme qui s'appelle approximativement PI et j'essaie de l'utiliser longtemps, mais cela ne fonctionne 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);
    }
}
 

63voto

karadoc Points 970

Apparemment %lld est le moyen le plus commun, mais qui ne fonctionne pas sur le compilateur que j'utilise (mingw32-gcc v4.6.0). Le moyen de le faire sur ce compilateur est: %I64d

Donc, essayez ceci:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

et

scanf("%I64d", &n);

Le seul moyen que je connaisse de faire cela dans un complètement portable est d'utiliser le définit en <inttypes.h>.

Dans votre cas, il devrait ressembler à ceci:

scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

C'est vraiment très laid... mais au moins il est portable.

3voto

Jonathan Leffler Points 299946
  • Votre scanf() déclaration doit utiliser %lld trop.
  • La boucle n'est pas une condition d'arrêt.
  • Il y a beaucoup trop de parenthèses et trop peu d'espaces dans l'expression

    pi += pow(-1.0, e) / (2.0*e + 1.0);
    
  • Vous ajoutez un sur la première itération de la boucle, et par la suite de zéro à la valeur de 'pi'; cela ne change pas la valeur du bien.
  • Vous devez utiliser explicitement un type de retour d' int pour main().
  • Dans l'ensemble, il est préférable de spécifier int main(void) quand il ignore ses arguments, même si c'est moins d'une affirmation catégorique que le reste.
  • Je n'aime pas de manière explicite de la licence accordée dans le C99 à omettre le retour à partir de la fin de l' main() et ne pas l'utiliser moi-même; j'écris return 0; d'être explicite.

Je pense que l'ensemble de l'algorithme est douteux quand écrits à l'aide d' long long; le type de données devrait probablement être plus comme long double (avec %Lf de la scanf() format, et peut-être %19.16Lf de la printf() formats.

0voto

hexa Points 4942

Tout d’abord,% d est pour un int

Donc, %1.16lld n'a aucun sens, car% d est un entier

Ce type de texte que vous faites est également inutile, utilisez le type tout droit, rend le code beaucoup plus lisible.

Ce que vous voulez utiliser est le type double , pour calculer pi puis utiliser %f ou %1.16f .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X