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 :

Division par zéro qui ne plante pas ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut Division par zéro qui ne plante pas ?
    Bonjour,

    Pourquoi est-ce-que se bout de code ne lève pas d'exception quand on l'exécute ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main ()
    {
        float a = 0 ;
        long b = 0 ;
        long c = 0 ;
     
        a = ((float)b / (float)c) * 100 ;
     
        return 0 ;
    }
    Quand je trace la valeur de a dans le débugger (VC++ 2005), j'ai a = -1.#IND000 mais pas de plantage.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Arpivu
    Pourquoi est-ce-que se bout de code ne lève pas d'exception quand on l'exécute ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main ()
    {
        float a = 0 ;
        long b = 0 ;
        long c = 0 ;
     
        a = ((float)b / (float)c) * 100 ;
     
        return 0 ;
    }
    Quand je trace la valeur de a dans le débugger (VC++ 2005), j'ai a = -1.#IND000 mais pas de plantage.
    Pourquoi y aurait-il un plantage ? Le langage C dit 'comportement indéfini', c'est tout. Tout peut arriver.

    L'erreur se produit au niveau du coprocesseur de calcul. Ensuite, selon le système elle est 'récupérée' d'une façon plus ou moins subtile. Ici, on voit bien que la valeur est indéterminée, s'agissant d'une division de 0 par 0, ça correspond au comportement décrit en mathématiques, ce qui me parait être un comportement 'raisonnable'.

    Avec Code:Blocks (MinGW), j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a = -1.#IND00
     
    Press ENTER to continue.
    avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main (void)
    {
       float a = 0;
       long b = 0;
       long c = 0;
     
       a = ((float) b / (float) c) * 100;
     
       printf ("a = %f\n", a);
       return 0;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Bon... on va dire que mon exemple est mauvais car il fait 0/0.

    Dans le cas du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main ()
    {
       float a = 0 ;
       long b = 2 ;
       long c = 0 ;
     
       a = ((float)b / (float)c) ;
       return 0 ;
    }
    On obtient le même résultat indéterminé : -1.#IND000. (On est plus dans le cas 'défini' en mathématiques)

    Le code suivant 'plante' comme on pourrait s'y attendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main ()
    {
       float a = 0 ;
       long b = 0 ;
       long c = 0 ;
     
       a = (float)(b / c) ;
       return 0 ;
    }

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Arpivu
    Bon... on va dire que mon exemple est mauvais car il fait 0/0.
    <...>
    On obtient le même résultat indéterminé : -1.#IND000. (On est plus dans le cas 'défini' en mathématiques)
    <...>
    Le code suivant 'plante' comme on pourrait s'y attendre :
    <...>
    Comme je te l'ai dit, le comportement est indéterminé, il peut se passer n'importe quoi. Chaque implémentation fait ce qu'elle veut.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

    C'est au programmeur de ne pas se mettre dans cette situation en prenant les mesures préventives qui s'imposent.

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

Discussions similaires

  1. [A-00] Division par zéro (access ne m'aime pas)
    Par Slici dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/03/2009, 18h41
  2. [Tableaux] Pb de division par zéro...
    Par blueice dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2005, 15h52
  3. [CR][VS.NET]Division par zéro
    Par San Soussy dans le forum SDK
    Réponses: 2
    Dernier message: 31/08/2005, 14h40
  4. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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