GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 3 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Benoît Chauvet
Le #587035
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 =)

Örjan Petersson
Le #587033
"Benoît Chauvet"
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/d...142004.asp


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


oliv
Le #587032
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=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.

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


Toute meilleure idée bienvenue.

--
oliv

Publicité
Suivre les réponses
Poster une réponse
Anonyme