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 :

[Overflow] Test pour la multiplication


Sujet :

C++

  1. #1
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut [Overflow] Test pour la multiplication
    Bonjour à tous.

    Je travaille sur une classe d'entiers (positifs uniquement) sécurisés qui lance des exceptions si la valeur obtenue lors d'une opération dépasse la valeur maximale pouvant être contenue dans cet entier.

    La question qui me préoccupe est de savoir comment gérer les overflows lors d'une multiplication avec un test simple et surtout efficace ?

    Je connais les 2 opérandes ainsi que la valeur maximale que mon type de donnée peut contenir. Je ne peux évidemment pas effectuer la multiplication et je ne vois aucun test utilisable sur les bits.

    Merci à vous

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si les opérandes sont R et L et que le maximum est MAX, il y a overflow si R != 0 && MAX/R < L

  3. #3
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Mmmmh oui. Mais on a le coût d'une division.

    J'aurais préféré quelque chose de plus rapide.

    J'ai regardé dans quelques papiers sur le net et c'est cette solution là qui est privilégiée ou alors l'utilisation du bit d'overflow dans le cas des micro-processeurs. Apperement c'est quand même la solution la plus simple.

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    a*b > max
    a > max/b si a>=0 et b>=0

    L'inégalité présentée est dans le mauvais sens !

    Attention, ce test peu de plus générer de faux positifs en sous estimant la valeur de la division, ce qui est le comportement normal sur le calcul sur entiers (10/3 donne 3).

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    a*b > max
    a > max/b si a>=0 et b>=0

    L'inégalité présentée est dans le mauvais sens !
    Oops, je corrige.

    Attention, ce test peu de plus générer de faux positifs en sous estimant la valeur de la division, ce qui est le comportement normal sur le calcul sur entiers (10/3 donne 3).
    Je ne suis pas d'accord. Tu aurais des faux positifs si tu determinais la limite en entier pour t'en servir avec des flottant, mais comme tu t'en sers pour des entiers le resultat est correct. Si tu multiplies 3 par 4, tu as bien quelque chose de plus grand que 10.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Les faux positifs sont la en cas de >= comme dans ton exemple .

    Il ne sont en effet plus la dans le mien, mais c'est tout a fait malgré moi

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 413
    Points : 23 851
    Points
    23 851
    Par défaut
    Citation Envoyé par Nanoc Voir le message
    J'ai regardé dans quelques papiers sur le net et c'est cette solution là qui est privilégiée ou alors l'utilisation du bit d'overflow dans le cas des micro-processeurs. Apperement c'est quand même la solution la plus simple
    La vraie question est : comment le microprocesseur détermine-t-il la valeur du bit d'overflow ? La réponse est plus simple qu'on ne le croit ! :-)

  8. #8
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Et quelle est-elle cette réponse ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Points : 86
    Points
    86
    Par défaut
    Si c'est en non signé suffit de regarder si la somme est inférieur a une opérande.. si c'est le cas ... c'est qu'il y a eu de l'overflow...

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    La somme de quoi ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Points : 86
    Points
    86
    Par défaut
    sik... effectivement c'est moi le boulet désolé j'ai rien dit

Discussions similaires

  1. Outils de test pour application WEB ?
    Par elitost dans le forum Outils
    Réponses: 4
    Dernier message: 16/12/2005, 17h27
  2. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 09h47
  3. XSL - choose et test pour balise vide
    Par enigma dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/07/2005, 09h02
  4. [Choix de langage] POO pour de multiples applications
    Par Shadowritter dans le forum Langages de programmation
    Réponses: 15
    Dernier message: 17/01/2005, 16h42
  5. [LG]tests pour la gestion d'erreur
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2003, 21h44

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