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 de "double" par "0"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    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

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    en c++ ou java une division t'amenrai a une execption

    Etant donné que la division par 0 est impossible

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    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 averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    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...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    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 expérimenté
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    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 émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    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 averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    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]

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    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 expérimenté
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    Par défaut
    Ok c bon, as-tu : -1.#INF00 ???

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Par défaut
    non -1 ou 1

    tu affiche comment le resultat?

    moi en


  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 235
    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 Expert

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    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 Expert

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    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 Langage
    Réponses: 9
    Dernier message: 30/04/2008, 15h09
  3. [MySQL] Sauvegarder du texte (db mysql) CR, single-quote, double-quote, etc
    Par vandeyy dans le forum PHP & Base de données
    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