OVH Cloud OVH Cloud

Overflow

4 réponses
Avatar
Guillaume Gourdin
Bonjour,

comment verifier que le résultat de a * b soit juste (a et b sont des int
signés) si a et b sont très grands ?

Merci.

4 réponses

Avatar
Fabien LE LEZ
On Sat, 6 Sep 2003 23:37:56 +0200, "Guillaume Gourdin"
wrote:

comment verifier que le résultat de a * b soit juste (a et b sont des int
signés) si a et b sont très grands ?


On ne peut pas. Le C++ n'a pas de mécanisme d'overflow pour les types
entiers.
Tu as plusieurs solutions, suivant le contexte :

- tester tes opérandes (par exemple, prendre dans chaque nombre la
position du bit le plus significatif qui est à 1, additionner les deux
positions, et en déduire si le produit tiendra dans un int)
- effectuer la multiplication avec des entiers plus grands que int
(des entiers de 64 bits si int est sur 32 bits sur ta machine), et
regarder si le résultat tient dans un int
- effectuer une approximation du résultat en passant par des flottants
- multiplier les deux "short de poids fort" dans un int, et voir si le
résultat tient dans un short
etc.

Avatar
Gabriel Dos Reis
Fabien LE LEZ writes:

| On Sat, 6 Sep 2003 23:37:56 +0200, "Guillaume Gourdin"
| wrote:
|
| >comment verifier que le résultat de a * b soit juste (a et b sont des int
| >signés) si a et b sont très grands ?
|
| On ne peut pas.

Jean-Marc a souovent montré que si. Probablement un autre candidat
pour la FAQ.

| Le C++ n'a pas de mécanisme d'overflow pour les types
| entiers.
| Tu as plusieurs solutions, suivant le contexte :

-- Gaby
Avatar
Fabien LE LEZ
On 06 Sep 2003 23:49:29 +0200, Gabriel Dos Reis
wrote:

Jean-Marc a souovent montré que si.


Gloups... Aurais-tu un message-id, par hasard (ou quelques
mots-clefs) ? Je n'arrive pas à retrouver les messages en question sur
Google :-/
Merci d'avance...

Avatar
Marc Boyer
Guillaume Gourdin wrote:
Bonjour,

comment verifier que le résultat de a * b soit juste (a et b sont des int
signés) si a et b sont très grands ?


J'ai écris un premier jet de classe qui fait surcharge les
opérateurs +,-,/,* et qui lance une exception en cas de déborment.

Si la classe elle même ne t'intéresse pas, le bout
de code qui fait ça est disponible en lisant le code
de l'opérateur *=.

http://www.enseeiht.fr/~boyer/Tools.html

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(