Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.
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
Fabien LE LEZ <gramster@gramster.com> writes:
| On Sat, 6 Sep 2003 23:37:56 +0200, "Guillaume Gourdin"
| <nospam@nospam.fr> 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 :
| 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
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...
On 06 Sep 2003 23:49:29 +0200, Gabriel Dos Reis
<gdr@integrable-solutions.net> 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...
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...
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 :-(
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 :-(