Problème de dépassement de capacité de calcul sur long
Le
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 :
x00000000000000000
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
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 :
x00000000000000000
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

Poser une question


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 =)
Ç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/d...142004.asp
--
Orjan Petersson, Logcode SARL
The email address in the From: header is valid
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=ja...amp;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.
Toute meilleure idée bienvenue.
--
oliv