IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Erreur floating point exception


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Wachter
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2008
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 404
    Par défaut Erreur floating point exception
    Bonjour,

    J'ai écrit un code qui affiche un nombre entier N sous la forme : N = a1 x 1! + a2 x 2! + ... + ap x p! avec a1 + ... + ap minimal.

    Exemple 1
    Entrée : N = 52
    Sortie : p = 4 ; les coefficients sont : 0, 2, 0, 2

    Exemple 2
    Entrée : N = 120
    Sortie : p = 5 ; les coefficients sont : 0, 0, 0, 0, 1

    J'obtiens l'erreur Floating Point Exception sur un serveur d'évaluation pour un entier donné que j'ignore (N <= 500 millions). Pourtant, j'ai évité une division par 0 (ou un modulo).

    Pour N = 479 000 000, j'ai p = 11 et les coefficients : 0, 1, 1, 3, 4, 4, 7, 8, 9, 10, 11
    Pour N = 480 000 000, il affiche p = 12 puis se plante !
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <iostream>
    #include <stack>
    #include <cstdio>
    using namespace std;
    stack<int> coef;
     
     
    int main()
    {
       int nb;
       scanf("%d", &nb);
     
       int fact = 1;
       int rang = 1;
       while (fact <= nb)
       {
           rang = rang + 1;
           fact = fact * rang;
       }
       fact = fact / rang;
       rang = rang - 1;
     
       printf("%d\n", rang);
       coef.push(nb / fact);
     
       while (rang >= 2)
       {
           nb = nb % fact;
           fact = fact / rang;
           rang = rang - 1;
           coef.push(nb / fact);
       }
     
       while(!coef.empty())
       {
           printf("%d ", coef.top());
           coef.pop();
       }
    }
    Merci pour votre aide !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Y'a fort à parier que fact = fact / rang; vaut 0 à un moment donné.
    Utilise un vrai debugger et tu le sauras assez vite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    De manière générale, j'ai toujours tendance à me méfier des divisions (et des modulos aussi). Si je suis certain que le diviseur ne sera jamais 0, je n'y mets pas de condition, sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float nombre, diviseur;
     
    nombre = (diviseur != 0 ? nombre / diviseur : 0);

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    13! = 6227020800 > INT_MAX après quoi on ne peut plus compter sur rien.

    @imperio, pourquoi utiliser des float ici? (en général, il vaut mieux ne pas utiliser les flottants. Quand il le faut, les doubles sont le choix normal, les floats ayant une précision faible ne sont à utiliser qu'après avoir montré qu'ils conviennent)

  5. #5
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    @Jean-Marc.Bourguet: Pas de raison particulière. Ça aurait tout aussi bien pu être un char qu'un unsigned long double. Je donnais juste un exemple.

    Concernant la précision faible des floats, je ne suis pas sûr de te suivre. La majorité des codes de bibliothèques mathématiques que j'ai vu utilisaient des floats et non des doubles. Si c'était vraiment si faible que ça, pourquoi ne pas utiliser des doubles dans ce cas ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Pour la vitesse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Floating point exception sous linux
    Par doommick31 dans le forum C++
    Réponses: 4
    Dernier message: 20/12/2012, 18h22
  2. [runtime exception] Floating point exception
    Par xion.luhnis dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 17/09/2010, 04h57
  3. Floating Point Exception
    Par étoile de mer dans le forum Débuter
    Réponses: 3
    Dernier message: 28/10/2009, 17h09
  4. Réponses: 1
    Dernier message: 06/05/2009, 16h36
  5. Floating point exception dans dlopen()
    Par Invité dans le forum C++
    Réponses: 0
    Dernier message: 10/06/2008, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo