J'aimerais gérer les débordement. Une brève recherche dans les archives
m'indique que ce n'est pas ce qu'il y a de plus aisé.
quand je fais :
float c = 1/(1e-40);
a vaut INF (normal)
qaund je fais :
float a = 1;
float b = 1e-40;
float c = a / b;
J'ai un messagebox qui m'affiche "Debordement en virgule flottante" !
Je voudrais 2 choses :
1/ Empècher l'affichage de ce messagebox
2/ que dans le 2eme cas, c vaut INF (comme dans le 1er cas)
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
Alexandre
bonjour,
quand je fais : float c = 1/(1e-40); a vaut INF (normal)
oui, moi c'est pareil.
qaund je fais : float a = 1; float b = 1e-40; float c = a / b;
moi je n'ai pas de messagebox, mais c vaut la valeur qu'il avait avant... Si tu fais float a=1; float b-40; float c=0; c=a/b;
c vaut 0 après, il faut 10 si tu l'as initialisé à 10, etc...
que la valeur soit différente est normale : 1/1e-40 peut être traité directement par le compilo, et donc affecter +INF. Par contre, 1e-40 n'est pas stockable... car non codable pour un float. La valeur que prend b est 9.999946E-41 sur ma machine... ceci dit, 1/9.999946E-41 devrait également valoir +INF pour un float.... Or à priori l'opérateur de division ne modifie rien dans ce cas (ce qui est fort étrange j'avoue)... Ce qu'il faut voir c'est que dans le cas float a=1/1e-40 le compilo n'appelle pas l'instruction de division du FPU, mais affece directement +INF à a. Alors que dans le 2e cas, l'instruction de division est appelée. Son comportement semble étrange, par contre. Sur ta machine on dirait qu'une exception est levée, alors que chez moi, non ? Etrange... Tu as essayé un try/catch autour de la division ?
bonjour,
quand je fais :
float c = 1/(1e-40);
a vaut INF (normal)
oui, moi c'est pareil.
qaund je fais :
float a = 1;
float b = 1e-40;
float c = a / b;
moi je n'ai pas de messagebox, mais c vaut la valeur qu'il avait avant... Si
tu fais
float a=1;
float b-40;
float c=0;
c=a/b;
c vaut 0 après, il faut 10 si tu l'as initialisé à 10, etc...
que la valeur soit différente est normale : 1/1e-40 peut être traité
directement par le compilo, et donc affecter +INF.
Par contre, 1e-40 n'est pas stockable... car non codable pour un float. La
valeur que prend b est 9.999946E-41 sur ma machine... ceci dit,
1/9.999946E-41 devrait également valoir +INF pour un float.... Or à priori
l'opérateur de division ne modifie rien dans ce cas (ce qui est fort étrange
j'avoue)...
Ce qu'il faut voir c'est que dans le cas float a=1/1e-40 le compilo
n'appelle pas l'instruction de division du FPU, mais affece directement +INF
à a. Alors que dans le 2e cas, l'instruction de division est appelée. Son
comportement semble étrange, par contre. Sur ta machine on dirait qu'une
exception est levée, alors que chez moi, non ? Etrange... Tu as essayé un
try/catch autour de la division ?
quand je fais : float c = 1/(1e-40); a vaut INF (normal)
oui, moi c'est pareil.
qaund je fais : float a = 1; float b = 1e-40; float c = a / b;
moi je n'ai pas de messagebox, mais c vaut la valeur qu'il avait avant... Si tu fais float a=1; float b-40; float c=0; c=a/b;
c vaut 0 après, il faut 10 si tu l'as initialisé à 10, etc...
que la valeur soit différente est normale : 1/1e-40 peut être traité directement par le compilo, et donc affecter +INF. Par contre, 1e-40 n'est pas stockable... car non codable pour un float. La valeur que prend b est 9.999946E-41 sur ma machine... ceci dit, 1/9.999946E-41 devrait également valoir +INF pour un float.... Or à priori l'opérateur de division ne modifie rien dans ce cas (ce qui est fort étrange j'avoue)... Ce qu'il faut voir c'est que dans le cas float a=1/1e-40 le compilo n'appelle pas l'instruction de division du FPU, mais affece directement +INF à a. Alors que dans le 2e cas, l'instruction de division est appelée. Son comportement semble étrange, par contre. Sur ta machine on dirait qu'une exception est levée, alors que chez moi, non ? Etrange... Tu as essayé un try/catch autour de la division ?