Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1125 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Comment detecter un depassement de capacite dans une addition

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment detecter un depassement de capacite dans une addition

n°706627
lyynx
Posté le 23-04-2004 à 01:16:09  profilanswer
 

En fait je voudrais juste que dans le cas ou le resultat depasse la valeur max possible une execption soit generee.

mood
Publicité
Posté le 23-04-2004 à 01:16:09  profilanswer
 

n°706629
weblook$$
Posté le 23-04-2004 à 01:30:44  profilanswer
 

long a,b;
a= a + b;
if(a > sizeof(long))
//lancer l'exception

n°706635
bjone
Insert booze to continue
Posté le 23-04-2004 à 02:21:45  profilanswer
 

:lol:
 
on me l'a jamais faite celle là...
 
if( a > sizeof(long) )
 
équivaut à
 
if( a > 4 )


Message édité par bjone le 23-04-2004 à 02:22:59
n°706636
bjone
Insert booze to continue
Posté le 23-04-2004 à 02:25:50  profilanswer
 

la meilleure solution serait, à froid, mais je suis pas sûr fodra que j'essayes:
 
int secured_add(long a, long b)
{
   long value;
 
   asm {
     mov eax,a
     add eax,b
     jno good
   }
 
   throw(...);
good:
   return value;
}

n°706639
bjone
Insert booze to continue
Posté le 23-04-2004 à 02:42:08  profilanswer
 

yep ça marche (t'as de la chance je t'ai fait un truc qui marche, passke je me suis jamais pris la tête à tester si j'avais des dépassements non désirés, vu qu'en général il sont désirés :D)
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class Add_Overflow_Exception
  4. {
  5. public:
  6. long a,b;
  7. Add_Overflow_Exception( int ca, int cb) : a(ca), b(cb) {};
  8. };
  9. long secured_add( long a, long b )
  10. {
  11. long value;
  12. _asm {
  13.  mov eax,a
  14.  add eax,b
  15.  mov value,eax
  16.  jno NoOverflow
  17. }
  18.     throw( Add_Overflow_Exception(a,b) );
  19. NoOverflow:
  20. return value;
  21. }
  22. int main()
  23. {
  24. try {
  25.  // a marche
  26.  cout<<secured_add(4,5)<<endl;
  27.  cout<<secured_add(-1,-1)<<endl;
  28.  cout<<secured_add( 0x7fffffff,0)<<endl; // 0x7fffffff: valeur max pour un entier 32bits signé
  29.  cout<<secured_add( 0x80000000,0)<<endl; // 0x80000000: valeur min pour un entier 32bits signé
  30.  // a kaput  
  31.  cout<<secured_add( 0x7fffffff,1)<<endl;
  32.  cout<<secured_add( 0x80000000,-1)<<endl;
  33. }
  34. catch( Add_Overflow_Exception &e )
  35. {
  36.  cout<<"Dépassement lors de l'addition de '"<<e.a<<"' et '"<<e.b<<"'\n";
  37. }
  38. }


 
donnera:
 

Citation :


9
-2
2147483647
-2147483648
Dépassement lors de l'addition de '2147483647' et '1'


Message édité par bjone le 23-04-2004 à 02:43:50
n°706645
lyynx
Posté le 23-04-2004 à 06:15:04  profilanswer
 

merci bcp. je n aurais jamais pensé a utiliser de l assembleur pour resoudre le probleme.

n°706648
skelter
Posté le 23-04-2004 à 07:12:31  profilanswer
 

eu... suffit pas tout simplement que a>(a+b) ? enfin pour un unsigned au moin


Message édité par skelter le 23-04-2004 à 07:13:18
n°706650
Taz
bisounours-codeur
Posté le 23-04-2004 à 07:14:44  profilanswer
 

bon ça y est vous avez fini vos conneries de merde là ?
non mais vous avez complètement pété un plomb là
et je parle de vos conneries en matière d'exception ...
 
la seule solution est  
http://www.enseeiht.fr/~boyer/Tools.html

n°706667
christophe​_d13
L'efficacité à tout prix.
Posté le 23-04-2004 à 08:23:26  profilanswer
 

à la place de "jno xxxx" tu peux faire "mov ebx, 0 ; seto bl" dans ebx tu auras 1 si dépassement.

n°706668
xterminhat​e
Si vis pacem, para bellum.
Posté le 23-04-2004 à 08:24:24  profilanswer
 

C'est drole qd même de marier C++ avec asm ;)


---------------
Cordialement, Xterm-in'Hate...
mood
Publicité
Posté le 23-04-2004 à 08:24:24  profilanswer
 

n°706717
Joel F
Real men use unique_ptr
Posté le 23-04-2004 à 09:31:27  profilanswer
 

euh y a une solution en pure C++ ....
ou est l'interet de cette affreuse bidouille ??

n°706773
HelloWorld
Salut tout le monde!
Posté le 23-04-2004 à 10:17:36  profilanswer
 

J'ai jeté un oeil au lien de Taz, le template est implémenté dans un fichier tpp. Comment ça se fait, je croyais que le stemplates devaient être implémentés dans le .h ?
 
Pour "l'algo" utilisé pour l"incrémentation, il est là:
On vaut additionner B à A :

Code :
  1. if ( B >= 0 ) {
  2.     if ( A > max - B ){
  3.       /* dépassement */
  4.     } else
  5.       A += B;
  6.   } else { // incr < 0
  7.     if ( A < min - B ) {
  8.       // <=> value - incr.value < min
  9.       /* dépassement*/
  10.     } else
  11.       A += B;
  12.   }


 
min et max valent std::numeric_limits<numType>::min() et std::numeric_limits<numType>::max()

n°706778
Joel F
Real men use unique_ptr
Posté le 23-04-2004 à 10:22:18  profilanswer
 

A la fin du hpp y a ca :
 
#include "CheckedNumeric.tpp"
#include "CheckedNumericNumericLimits.tpp"
 
.... ^^

n°706872
HelloWorld
Salut tout le monde!
Posté le 23-04-2004 à 11:22:08  profilanswer
 

"I can see clearly now"...

n°706950
bjone
Insert booze to continue
Posté le 23-04-2004 à 12:09:01  profilanswer
 

la mienne elle est ptet crade, mais elle passe pas par 30 comparaisons et branchement.... (et en même temps elle mais en évidence une certaine forme de lacune du langage puisque le hardware expose le dépassement, alors qu'avec le langage on doit faire un hack dégueulasse pour émuler les capacitées du hardware)
 
concernant l'exception, c'est un exemple Tazeuuuuuuuuu.....

n°707000
Taz
bisounours-codeur
Posté le 23-04-2004 à 12:55:02  profilanswer
 

bjone a écrit :

la mienne elle est ptet crade, mais elle passe pas par 30 comparaisons et branchement.... (et en même temps elle mais en évidence une certaine forme de lacune du langage puisque le hardware expose le dépassement, alors qu'avec le langage on doit faire un hack dégueulasse pour émuler les capacitées du hardware)
 
concernant l'exception, c'est un exemple Tazeuuuuuuuuu.....

le hack dégeux, c'est justement ton assembleur non-portable et en pkus difficile à utiliser dans du code alors qu'avec mon lien, tu peux invertir code normal avec des types de entiers et CN<type entiers> sans problème

n°707053
bjone
Insert booze to continue
Posté le 23-04-2004 à 13:25:51  profilanswer
 

j'ai précisé "pour émuler les capacitées du hardware". (c'est vrai que c'est assez variable)
 
mais si dans le C++ on déinierai un truc comme ça:
 
try (check_for_overflow)
{
  a=(b+c)/d;
}
 
catch( add_overflow e)
{
   ...
}
 
catch( div_overflow e )
{
 ...
}
 
je n'ai pas de solution miracle, mais il est vrai qu'une solution asm est un hack dégueu non portable, mais qu'une solution par bricolage de langage alors que la hardware offre potentiellement la chose est aussi un hack dégueu d'un autre point de vue.
 
ce qui serait bien c'est qu'au niveau ISO/ANSI/IEEE, une extension soit proposé pour le C++, afin d'utiliser les capacitées hardware, voir de les améliorer (il y a bien une exception pour les divisions par zéro, on peut très bien ajouter une exception à l'archi x86 quand le bit d'overflow est déclenché dans le registre des flags)
 
enfin ce que j'en dit.... (je fais juste que proposer hein)

n°707388
HelloWorld
Salut tout le monde!
Posté le 23-04-2004 à 17:10:52  profilanswer
 

Citation :

on peut très bien ajouter une exception à l'archi x86 quand le bit d'overflow est déclenché dans le registre des flags


Si on est ingénieur chez Intel peut être, sinon...

n°707491
christophe​_d13
L'efficacité à tout prix.
Posté le 23-04-2004 à 19:52:39  profilanswer
 

Le code officiel de dépassement :
OverFlow = Carry0(MSB)^Carry0(MSB-1)
 
source : intel

n°707528
el muchach​o
Comfortably Numb
Posté le 23-04-2004 à 20:53:15  profilanswer
 

Questions bêtes au hasard...  
a) si a est signé il suffirait de comparer le signe de a avant et après l'opération, non (attention au cas du passage par zéro) ? Ou s'il est non signé, vérifier que le résultat est supérieur (ou égal) à la valeur d'origine (pour une addition).
b) pour quelle utilisation particulière a-t'on besoin de faire une telle vérification ?


Message édité par el muchacho le 23-04-2004 à 21:09:04
n°708297
HelloWorld
Salut tout le monde!
Posté le 26-04-2004 à 09:33:17  profilanswer
 

Dans les 2 cas il suffit de vérifier que a1 > a0 après opération.

n°709093
el muchach​o
Comfortably Numb
Posté le 26-04-2004 à 20:37:55  profilanswer
 

Pas si tu sommes deux entiers négatifs. On est obligé de distinguer le cas où b est < 0, d'où le code un peu tordu que tu as donné plus haut.


Message édité par el muchacho le 26-04-2004 à 20:39:35
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Comment detecter un depassement de capacite dans une addition

 

Sujets relatifs
[résolu] dépassement de capacité[C++] Donner la date system et addition de date
addition de dates[Batch] addition genre %TIME:~0,5% + 10 pour avancer de 10 min..
Comment détecter une valeure vide ?[PHP/SQL] Addition de valeur numérique d'un champ d'une table
Quelle est la meilleure manière de détecter Opera ?addition de date
Détecter si l'OS est Win ou linux... 
Plus de sujets relatifs à : Comment detecter un depassement de capacite dans une addition


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR