0
votes

Comment calculer 37 décimales de numéro d'Euler en C?

J'ai le code suivant et il renvoie: 2.71828182845904553488480814849026501148490265011484902650118490265011828459045 strong> est juste et le reste est faux et le reste est faux.

J'utilise la référence suivante: 2.71828182845904523536028747135266249777 STRUT> http://www.vaxasoftware.com/doc_edu/mat/nume15000.pdfled/a > p>

Mon code est le suivant: P>

#include "gmp.h"
#include <stdio.h>
#include <math.h>

#define EPSILON 1.0e-15

int main() {
    unsigned long long fact = 1;
    double e = 2.0, e0;
    int n = 2;
    do {
        e0 = e;
        fact *= n++;
        e += 1.0 / fact;
    }
    while (fabs(e - e0) >= EPSILON);
    printf("e = %.37f\n", e);
    return 0;
}


5 commentaires

Vous devrez écrire un logiciel de précision étendu ou obtenir et utiliser ce logiciel, tel que GMP . Le format double dans la plupart des implémentations C a une précision autour d'une partie de 2 ^ 52, soit environ 10 ^ 15,65. Pour 37 chiffres, vous avez besoin de précision d'une partie dans 10 ^ 37 juste pour le résultat, et plus pour les calculs intermédiaires. De plus, vous devrez changer epsilon , à la fin du calcul du calcul lorsque la variation de la somme atteint 10 ^ -15 sera insuffisante pour calculer E à une partie dans 10 ^ 37.


Merci pour votre commentaire ... Oui monsieur, j'utilise GMP, mais je ne sais vraiment pas comment je peux prolonger la fonctionnalité


Vous dites que vous utilisez GMP, mais le code que vous affichez dans la question n'utilise pas de GMP, à l'exception de l'inclure l'en-tête. Inclure l'en-tête ne change pas la manière dont les types intégrés de C tels que double . Vous devez appeler des routines de la bibliothèque GMP. Pour ce faire, commencez par lire la documentation GMP.


Oh oui, tu as raison. Je vais lire la documentation. Je commence par GMP et C. Merci pour votre aide.


Je soupçonne que beaucoup de problème est que cela fait des ajouts (à E + = 1.0 / fait; ) dans la commande "la plus grande à la plus petite". Pour améliorer la précision, vous voudrez que le contraire, qui n'est pas joli (par exemple, stocker peut-être les valeurs de 1 / fait dans un tableau, alors avez une seconde boucle qui fait "E = somme de valeurs dans déployer"?).


3 Réponses :


1
votes

Comment calculer 37 décimales pour Euler en C? P>

2 128 sup> est d'environ 3,4 * 10 38 sup>. En formant un numérateur / dénominateur entier de 128 bits, nous pouvons atteindre le e em>. P>

réécrire la boucle comme ci-dessous et allongez-vous jusqu'à un n Code> jusqu'à num * i + 1 code> est sur le point de déborder (n == 33), nous pouvons arriver à / près du résultat souhaité. p>

long double e(int n) {
  unsigned __int128 fact = 1;
  unsigned __int128 num = 1;
  for (int i=1; i<=n; i++) {
    fact *= i;
    if (num >  (((unsigned __int128)-1)-1)/i) { printf("%d!\n", i); exit(0); }
    num = num*i + 1;
  }
  return 1.0L*num/fact;
}

int main() {
  for (int i=1; i<34; i++)  {
    printf("%d %.25Lf\n", i, e(i));
  }
}

   2,718281828459045235 3602874713526624977
33 2.718281828459045235 4281681


0 commentaires

-1
votes

Je diminue votre valeur dans.

printf("e = %.15f\n", e);


0 commentaires

1
votes

Mon code est: P>

#include "gmp.h" code> p>

Il suffit d'inclure cet en-tête n'utilise pas d'arithmétique multi-précision par magie; Vous allez avoir à utiliser les fonctions appropriées forts> comme documenté dans le manuel de la député GNU ! p>

Par exemple, vous utiliseriez P>

{
  mpf_t x;
  mpf_init2 (x, 100);
  ...


0 commentaires