Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/02/2008, à 19:49

kentinCA

Floating Point exception core dumped

j'essaye de programmer un truc qui me donne une approximation de exp(1)

le morceau principal du code qui est en C++ est:

long i=1;
double eps;

cout <<"Entrez le epsilon souhaite!" << endl;
    cin >> eps;

    do
    {
        val = val + 1/fac(i);
        i++;
    }
    while (val-exp(1)<=eps);

    val = val +1;

    cout <<"Une valeur approchee de e est "<< val << endl;

si quelqu'un avait une idée pour arranger ca!

merci

Hors ligne

#2 Le 20/02/2008, à 19:50

kentinCA

Re : Floating Point exception core dumped

avec ca aussi


//LA FACTORIELLE DE N

unsigned long fac(unsigned long k)
{
    if (k==0)
        return 1;
    else
        return (k*fac(k-1));
}

Hors ligne

#3 Le 20/02/2008, à 20:58

Aurel34

Re : Floating Point exception core dumped

kentinCA a écrit :

j'essaye de programmer un truc qui me donne une approximation de exp(1)

le morceau principal du code qui est en C++ est:

long i=1;
double eps;

cout <<"Entrez le epsilon souhaite!" << endl;
    cin >> eps;

    do
    {
        val = val + 1/fac(i);
        i++;
    }
    while (val-exp(1)<=eps);

    val = val +1;

    cout <<"Une valeur approchee de e est "<< val << endl;

si quelqu'un avait une idée pour arranger ca!

merci

ton exp(1) c'est celui de la libc ? parce que quitte à  faire tout ça autant pas utiliser la libc (tu pars du résultat smile)...

en général le "epsilon" est une valeur min de l'incrément, ici 1/fac(i), voire des formules plus précises (genre TRI) mais ce n'est généralement pas la peine.

pour ton exception c'est peut-être un underflow dans ton 1/fac(i)

après j'avoue que j'ai un peu la flemme de tester smile

Hors ligne

#4 Le 20/02/2008, à 21:10

Le Farfadet Spatial

Re : Floating Point exception core dumped

Salut à  tous !

   Est-ce que tu peux essayer d'être plus clair ? Déjà , pour préciser : lorsque tu exécutes ton programme dans une console, tu obtiens le message « Floating Point exception core dumped, » c'est bien ça ?

   Ensuite, tu nous donnes un bout de code balancé un peu n'importe comment, on ne sait même pas quel est le type de val... Je suppose qu'il s'agit d'un double.

   As-tu essayé de faire tourner ton code dans un débogueur ?

   Enfin, as-tu essayé de te demander ce que pouvait valoir ta factoriel ? Tu devrais regarder, j'espère que ça te fera réagir...

   à€ bientà´t.

                                                                                                          Le Farfadet Spatial

Hors ligne

#5 Le 20/02/2008, à 21:26

Le Farfadet Spatial

Re : Floating Point exception core dumped

Re-salut à  tous !

   Je me dis que, pour avoir pondu un code pareil, tu es débutant (aucune offense), donc il faut que j'y aille un peu plus pas-à -pas. Exécute le programme suivant (une version à  peine modifiée du tien) :

#include <iostream>
#include <cmath>

unsigned long fac(unsigned long k)
{
    if (k==0)
        return 1;
    else
        return (k*fac(k-1));
}

int main (int, char **) {
  long i=1;
  double eps;

  std::cout <<"Entrez le epsilon souhaite!" << std::endl;
  std::cin >> eps;

  double val = 0.;

  do
    {
      const double factorielle = fac(i);
      if (factorielle == 0) {
	std::cout << "Oups ! Division par 0 !" << std::endl;
	break;
      }
      else val = val + 1/fac(i);
      i++;
    }
  while (val-exp(1)<=eps);

  val = val +1;

  std::cout <<"Une valeur approchee de e est "<< val << std::endl;

  return 0;
}  // main

Et reviens ici dire ce que tu as obtenu. à€ partir de là , nous pourrons lancer une discussion sur l'erreur que tu as faite, qui révèle un problème du calcul sur ordinateur (c'est-à -dire sur une arithmétique finie) par rapport aux calculs généralement effectués en mathématiques.

    à€ bientà´t.

                                                                                                          Le Farfadet Spatial

Hors ligne

#6 Le 20/02/2008, à 22:42

kentinCA

Re : Floating Point exception core dumped

je suis .... completement débutant sur C/C++, je fais du maple à  mes heures perdues.

cependant je me débrouile pas trop mal en maths et malheureusement factorielle de 0 c'est égale à  1, d'ou le fait que je ne comprenne le Floating Point exception.

Quand au debogeur je voyais pas trop à  quoi ca servait, mais j'ai compris le truc maintenant merci pour les indications!

Hors ligne

#7 Le 20/02/2008, à 23:25

Le Farfadet Spatial

Re : Floating Point exception core dumped

Salut à  tous !

kentinCA a écrit :

je suis .... completement débutant sur C/C++, je fais du maple à  mes heures perdues.

cependant je me débrouile pas trop mal en maths

C'est bien ce que je subodorais... Cela dit, pour devenir un programmeur avancé, il faut commencer par débuter !

   Pour ma part, même si je fais pas mal de programmation (de l'analyse numérique pour être précis), je suis d'abord et avant tout un mathématicien, nous sommes donc fais pour nous entendre !

malheureusement factorielle de 0 c'est égale à  1

Tu as tout à  fait raison. D'ailleurs, ta fonction factorielle renvoie : fac(0) = 1. Oui monsieur !

   Non, comme le dirait l'agent Mulder, la vérité est ailleurs.

   En général, en mathématiques, on a recours à  des ensembles de cardinal infini --- N, Z, R ou C, --- tandis qu'un ordinateur, étant par définition une machine finie, n'utilise que des ensembles finis --- donc discontinus, y compris pour les flottants. Il en résulte plusieurs problèmes : d'abord des erreurs de calculs en permanence, ensuite une limitation dans les nombres représentables. De tel sorte que, par exemple, les longs sont certes très grand, mais la factoriel l'est encore plus ! Pour différentes raisons techniques, lorsque cela devient trop grand, l'ordinateur fait un tour et c'est ainsi que ta factorielle s'annule --- 0 x n'importe quoi = 0.

   Pour l'instant, retient qu'il faut utiliser des doubles pour ta fonction factorielle. Cela dit, si tu veux parler plus en détails des erreurs de calcul induites par l'utilisation d'un ordinateur, je suis ton homme !

Quand au debogeur je voyais pas trop à  quoi ca servait, mais j'ai compris le truc maintenant merci pour les indications!

Linus Torvarld trouve que les débogeurs pousse à  se focaliser sur les conséquences plutà´t que les causes (raison pour laquelle il n'en utilise pas) et je ne suis pas loin de lui donner raison (raison pour laquelle je n'en utilise pas). Cependant, ce genre d'outils a un avantage : il permet de voir l'ordinateur à  l'Å“uvre, ce qui permet de comprendre certaines bogues.

   à€ bientà´t.

                                                                                                                                             Le Farfadet Spatial

Hors ligne

#8 Le 21/02/2008, à 00:01

kentinCA

Re : Floating Point exception core dumped

d'accord, merci pour les explications sur la factorielle je ne comprenais pas pourquoi à  partir d'un certain rang c'était égale à  0.

mais comment fait on si l'on veut utiliser une factorielle à  un rang très élevé, pareil pour un exp(A), A très grand?
parce que bon à  partir de 30-40 pour la factorielle ca doit être impossible de stocker ca, non?

Hors ligne

#9 Le 21/02/2008, à 01:03

Le Farfadet Spatial

Re : Floating Point exception core dumped

Salut à  tous !

kentinCA a écrit :

mais comment fait on si l'on veut utiliser une factorielle à  un rang très élevé, pareil pour un exp(A), A très grand?
parce que bon à  partir de 30-40 pour la factorielle ca doit être impossible de stocker ca, non?

Pas impossible, mais ça peut devenir très compliqué quand même, surtout si on en cherche la valeur exacte et ce pour des nombres très élevées !

   Pour une première approximation, disons qu'à  partir de factorielle 10, il vaut mieux la stocker sous forme de flottant en double précision (double en C/C++), même si cela signifie n'en utiliser qu'une valeur approchée.

   Essaye donc ce code là  :

#include <iostream>
#include <cmath>

double fac (unsigned long k) {
  if (k == 0) return 1.;
  else return (k * fac(k - 1));
}  // double fac (unsigned long)

int main (int, char **) {
  double eps;
  std::cout << "Entrez le epsilon souhaité : ";
  std::cin >> eps;

  double val = 1.;
  for (int i = 1; std::abs(std::exp(1.) - val) > eps; ++i) val += 1. / fac(i);

  std::cout << "Une valeur approchée de e est : " << val << std::endl;

  return 0;
}  // main

Une nouvelle version de ton code, un peu modifié afin qu'il soit plus proche d'une approche C++, quant bien même la vraie approche C++ serait plutà´t celle là  :

#include <iostream>
#include <cmath>

int main (int, char **) {
  std::cout << "Une valeur approchée de e est : " << std::exp(1.) << std::endl;

  return 0;
}  // main

C'est-à -dire qu'il y a déjà  quelque chose de bien fait et performant, alors autant l'utiliser ! Néanmoins, avec la version que je te propose, chez moi j'obtiens :

$ e
Entrez le epsilon souhaité : 1e-6
Une valeur approchée de e est 2.71828

Cela dit, il est un peu étrange d'utiliser l'exponentielle pour calculer une exponentielle sans utiliser l'exponentielle... Donc, pourquoi ne pas plutà´t faire ceci :

#include <iostream>
#include <cmath>

double fac (unsigned long k) {
  if (k == 0) return 1.;
  else return (k * fac(k - 1));
}  // double fac (unsigned long)

int main (int, char **) {
  double eps;
  std::cout << "Entrez le epsilon souhaité : ";
  std::cin >> eps;

  double val = 1.;
  double val_anc = val + 2 * eps;
  for (int i = 1; std::abs(val - val_anc) > eps; ++i) {
    val_anc = val;
    val += 1. / fac(i);
  }

  std::cout << "Une valeur approchée de e est : " << val << std::endl;

  return 0;
}  // main

Nous avons là  une vraie méthode itérative, ce qui est beaucoup plus satisfaisant pour le numéricien !

   à€ bientà´t.

                                                                                                                                             Le Farfadet Spatial

Dernière modification par Le Farfadet Spatial (Le 21/02/2008, à 01:27)

Hors ligne

#10 Le 21/02/2008, à 20:55

Le Farfadet Spatial

Re : Floating Point exception core dumped

Salut à tous !

   Bon, il y a eu comme une petite bogue sur le forum, dirait-on. Je pense néanmoins que l'essentiel est resté.

   Juste, je reviens un peu à la charge pour un petit point qui peut-être intéressant pour le débutant. En effet, pour montrer un peu les possibilités du C++ en manière de boucle pour, j'avais écrit le code suivant :

  double val = 1.;
  double val_anc = val + 2 * eps;
  for (int i = 1; std::abs(val - val_anc) > eps; ++i) {
    val_anc = val;
    val += 1. / fac(i);
  }

Cependant, avec des choix peu réaliste pour epsilon, on peu avoir val + 2 * eps == val et alors on ne rentrera jamais dans la boucle. Il y a un moyen de régler ce problème :

#include <iostream>
#include <cmath>

double fac (unsigned long k) {
  if (k == 0) return 1.;
  else return (k * fac(k - 1));
}  // double fac (unsigned long)

int main (int, char **) {
  double eps;
  std::cout << "Entrez l'epsilon souhaité : ";
  std::cin >> eps;

  double val = 1.;
  double val_anc;
  int i = 0;
  do {
    ++i;
    val_anc = val;
    val += 1. / fac(i);
  } while (std::abs(val - val_anc) > eps);

  std::cout << "Une valeur approchée de e est : " << val << std::endl;

  return 0;
}  // main

Le corps de la boucle do { ... } while sera exécuté au moins une fois, ce qui évite d'ajouter une valeur qui pourrait être trop faible pour être prise en compte.

   Voilà, maintenant, je n'ai plus rien à ajouter, jusqu'à la prochaine question.

   À bientôt.

                                                                                                                                             Le Farfadet Spatial

Dernière modification par Le Farfadet Spatial (Le 21/02/2008, à 20:55)

Hors ligne