Problème de dépassement de capacité de calcul sur long
3 réponses
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.
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
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 =)
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 =)
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
"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
-- Orjan Petersson, Logcode SARL The email address in the From: header is valid
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
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.
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.