1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2003
    Messages : 24
    Points : 12
    Points
    12

    Par défaut division de "double" par "0"

    Bonjour.

    J'aimerai avoir des explications sur le raisonnement d'un compilateur (ici le VC++) quand a la division de double par 0.


    Code : 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
     
    double a,b,c;
     
    a=0;           // division de 0 par 0
    b=0;
     
    c=a/b;         // alors c = -1
     
     
    a=10;         // division d un double positif
    b=0;
     
    c=a/b;         // alors c = 1
     
     
    a=-10;       // division d un double negatif
    b=0;
     
    c=a/b;         // alors c = -1
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2003
    Messages : 4 506
    Points : 5 481
    Points
    5 481

    Par défaut

    en c++ ou java une division t'amenrai a une execption

    Etant donné que la division par 0 est impossible
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 229
    Points : 259
    Points
    259

    Par défaut

    En théorie la division par 0 est impossible. Le compilo essay peut-être de mettre une valeur bidon pour éviter que ca plante ds tous les sens.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2003
    Messages : 24
    Points : 12
    Points
    12

    Par défaut

    exact, le calcul étant impossible, je pensais que le calcul ne serait pas effectué et que " c " garderai sa valeur initiale cad 0.

    Or ce n'est pas le cas...

    Tu pense que ce calcul n'est en réalité pas effectué par le compilateur, que celui ci détecte une exception et attribue a " c " une valeur arbitraire (et irrationnelle) en l'occurence -1 ou 1 en fonction du signe du numerateur?

    En tout cas ca ne me semble pas etre une mauvaise explication...
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 229
    Points : 259
    Points
    259

    Par défaut

    Bon j'ai essayer ca ss VC6:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream.h>
     
    void main()
    {
    	int a,b,c;
    	a=0;
    	b=0;
    	c=a/b;
     
    	cout << "Valeur:" << c <<endl;
    }
    Et ca me balance une erreur de division par 0. ca ne compile même pas.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 229
    Points : 259
    Points
    259

    Par défaut

    Enfin ca compile, ms ca bug lors de l'execution. Ce qui est pour moi plus normal, que ton cas. T'as ptetre une option qui laisse passer des erreurs de ce genre et qui met des bizarreries à la place.

  7. #7
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 504
    Points : 745
    Points
    745

    Par défaut

    Regarde donc la norme ieee754. En fait, le nombre doit surement etre un Nan (not a number) et prend donc une valeur au pif ! Il y a des regles justement dans les cas "impossibles" (x/0, 0/0)...

    Si tu veux, tu peux je crois activer exceptions, i.e. une division par zero arrete ton prog et affiche un petit message d'erreur je crois (a moins que ce ne soit pour les entiers).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2003
    Messages : 24
    Points : 12
    Points
    12

    Par défaut

    C'est normal t'as fais ca avec des int, c'est un ensemble plus restreint que les double ca permet moins d'operation.

    Je ne saurais pas vraiment t'expliquer pkoi mais ca me semble plus logique...

    Il nous faudrait un pro pour expliquer ce phénomen paramnormale... Anomaly ou est tu??



    Et a part ca j'ai fais des test, la valeur n'est pas hazardeuse, c'est -1 ou 1 donc l'explication que j'ai ecrite + haut doit etre vrai[/quote]
    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 229
    Points : 259
    Points
    259

    Par défaut

    Oui je viens d'essayer les doubles passent chz moi, mais j'ai que des 0 comme résultat et pas 1 ou -1.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 229
    Points : 259
    Points
    259

    Par défaut

    Ok c bon, as-tu : -1.#INF00 ???

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2003
    Messages : 24
    Points : 12
    Points
    12

    Par défaut

    non -1 ou 1

    tu affiche comment le resultat?

    moi en

    MDS 97 - Visual C++ 5.0 - Win XP - C++ & C

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    août 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2003
    Messages : 229
    Points : 259
    Points
    259

    Par défaut

    C'est normal que tu es que 1 ou -1 alors. En clair, ca ^t'affiche l'erreur qd même.

  13. #13
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533

    Par défaut

    Si tu veux proprement gérer les exceptions du FPU (coprocesseur arithmétique) : utilise <fenv.h>.

    Tu peux utilise mes entêtes : hfpu.h et hfpu.cpp
    Ils émulent fenv.h sous Borland C++. Tu peux faire la même chose sous Visual C++ je pense (à vérifier).

    Ensuite, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define TEST_EXCEPTION FE_OVERFLOW | FE_DIVBYZERO | FE_UNDERFLOW
      double x;
      fegetexceptflag (&sauve_fpu, TEST_EXCEPTION);
      feclearexcept (TEST_EXCEPTION);
      x  = 1.0;
      x /= 0.0;
      if (fetestexcept(FE_UNDERFLOW)) Erreur underflow ...
      if (fetestexcept(FE_OVERFLOW)) Erreur overflow ...
      if (fetestexcept(FE_DIVBYZERO)) Erreur de division par zéro ...
      fesetexceptflag (&sauve_fpu, TEST_EXCEPTION);
    Code complet pour différent opérateurs : reel_op.h et reel_op.cpp

    @+ Haypo

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 71
    Points : 78
    Points
    78

    Par défaut

    pour le compilateur microsoft, _isnan(double d) permet de savoir si une valeur double est le résultat d'une division pr 0... mais il n'y a effctivement aucune exception de jetée

  15. #15
    Membre émérite

    Inscrit en
    mars 2002
    Messages
    255
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 255
    Points : 2 533
    Points
    2 533

    Par défaut

    Pour avoir plus d'info sur la FPU :
    http://cch.loria.fr/documentation/IEEE754/ (site de Loria, un labo de recherche)

    Si Visual C++ ne génère pas d'exception, ce qu'il a choisi de ne pas en générer : voir la fonction _control87.

    @+ Haypo

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

Discussions similaires

  1. [ICEFACES] Les quotes sont remplacées par &#_39;
    Par Mathieu.J dans le forum JSF
    Réponses: 0
    Dernier message: 19/01/2010, 16h09
  2. quotes, doubles quotes, échappement etc. au secours !
    Par robiwan dans le forum Débuter
    Réponses: 9
    Dernier message: 30/04/2008, 15h09
  3. Réponses: 7
    Dernier message: 12/03/2007, 11h22

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