OVH Cloud OVH Cloud

Debordement en virgule flottante

1 réponse
Avatar
PurL
Bonjour,

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)

Merci pour votre aide,

PurL

1 réponse

Avatar
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 ?