OVH Cloud OVH Cloud

Problème de dépassement de capacité de calcul sur long

3 réponses
Avatar
Benoît Chauvet
Bonjour

J'ai un petit problème à vous soumettre

Voici un petit bout de code avec son résultat :

long x = (long)1E18;
for (int i = 0; i <4; i++)
{
System.out.println("x="+x);
x = x * x;
}
---------------------------
STDOUT :
x=1000000000000000000
x=-5527149226598858752
x=0
x=0

Je sais que ce comportement curieux provient d'un dépassement des limites du
type long. Cependant, ce qui m'ennuie, c'est que je ne suis pas averti de ce
dépassement. J'aurais aimé avoir une exception dans ce cas, or il semble que
cela ne soit pas le cas.

Le problème n'existe pas lorsqu'on travaille avec des double, en effet :
double x = 1E80;
for (int i = 0; i <4; i++)
{
System.out.println("x="+x);
x = x * x;
}
---------------------------
STDOUT :
x=1.0E80
x=1.0E160
x=Infinity
x=Infinity

D'ailleurs, les méthodes Double.isNaN(double) et Double.isInfinity(double)
sont bien implémentées et efficaces.

Existe-t'il une solution de contournement à ce problème ? Comment savoir si
le résultat du calcul précédent est correct ou non, lorsque l'on manipule
des grands nombres ? Je préfère évidemment être averti d'une erreur de
dépassement de capacité, plutot que d'avoir un résultat faux.

Merci de vos réponses

3 réponses

Avatar
Benoît Chauvet
Benoît Chauvet wrote:
Bonjour

J'ai un petit problème à vous soumettre
(...)


Existe-t'il une solution de contournement à ce problème ? Comment
savoir si le résultat du calcul précédent est correct ou non, lorsque
l'on manipule des grands nombres ? Je préfère évidemment être averti
d'une erreur de dépassement de capacité, plutot que d'avoir un
résultat faux.


Il n'y a donc pas de moyen de trapper cette erreur ?
Personne n'a une idée sur le sujet ?

--
Orabîg, qui postera plus de question le vendredi soir, elles se perdent dans
le week-end, sinon =)

Avatar
Örjan Petersson
"Benoît Chauvet" writes:

Benoît Chauvet wrote:
Bonjour

J'ai un petit problème à vous soumettre
[comment traiter integer overflow]



Ça ne réponds pas directement a la question mais il y a beaucoup
d'info dedans:

Integer Handling with the C++ SafeInt Class, David LeBlanc

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncode/html/secure01142004.asp


--
Orjan Petersson, Logcode SARL
The email address in the From: header is valid


Avatar
oliv
Benoît Chauvet wrote:
Il n'y a donc pas de moyen de trapper cette erreur ?
D'après la spec de java et d'après une discussion que j'ai pu voir à

ce sujet il n'y aurait pas d'autre moyen que de faire ses propres
routines protégées, comme dans
http://groups.google.fr/groups?q=java+long+overflow+throws&hl=fr&lr=&ie=UTF-8&selm4c8f884.621420487%40news.ruralnet.net&rnum=3
bien que la condition choisie me paraisse un peu laxiste.

Bien sûr ça a des effets sur la lisibilité du code et son exécution.

Personne n'a une idée sur le sujet ?
Ou alors employer des BigInteger.


Toute meilleure idée bienvenue.

--
oliv