Bonjour,
Question toute bête sans doute, mais j'ai par exemple:
double x,y,z;
z = x - y;
comment gérer l'underflow sur z ?
D'avance merci,
bv
(j'utilise MS VisualStudio 2005)
Bonjour,
Question toute bête sans doute, mais j'ai par exemple:
double x,y,z;
z = x - y;
comment gérer l'underflow sur z ?
D'avance merci,
bv
(j'utilise MS VisualStudio 2005)
J'ai une DLL écrite en C qui est interfacée à Excel.
Je transmets donc des 'doubles' vers la DLL où des calculs sont effectués puis renvoyés vers la feuille de calcul.
Il se trouve que ces calculs génèrent parfois un underflow.
Merci d'avance
bv
je repete : que veux-tu dire par "underflow" ????????????????????
oops sorry...
une valeur trop proche de zéro, l'exact opposé de l'overflow, nombre trop grand pour la capacité d'un 'double'.
"l'underflow" depuis que je fais de l'informatique c'est la première fois que je vosi ça de ma vie.
Ton problème c'est un problème de format et taille de données différents entre Excel/Visual Basic et le C.
Aller sur www.codeproject.com ou dans le MSDN il ya une table de différence entre Visual Basic et C/c++
rien de bien extraordinaire pourtant.
je travaille sur un algorithme mathématique d'optimisation. On recherche donc une convergence entre une valeur théorique et une valeur réelle et dans certains cas, elle est très faible.
La plupart des fonctions comme sqrt par exemple de la librairie math, traitent les exceptions classiques y compris l'underflow, et je voudrais faire de même avec une simple soustraction.
bon on commence qa voir plus clair..
Mais l'expression "underflow" est incomprise....
Maintenant pour ton probleme :
je signale que, dans les fichiers d'entetes de la biblotheque standard, tu as le fichier "limits.h", qui definit les valeurs max, min et de detection de chaque type de variable.
Tu as donc un DBL_EPSILON (ou EPSILON_DBL, je neme souviens plus) qui donne la plus petite variation mesurable entre 2 doubles.
Vu que c'est de l'ordre de 10^-13 (ou -17), m'etonnerait que pour des finances ce soit ton ordre de grandeur.....
Donc je ferais simplement une multiplication par 10000, ou quelque chose comme ca, si la valeur est < 1.
Sinon, si tu veux tester par rapport a zero, tu fais
ce qui equivaut a
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( (a - b) == DBL_EPSILON )
Ou bien, si tu veux tester par rapport a une petite valeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( (a - b) == 0 )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #define ACCURACY 0.000001 if ( fabs(a-b) <= ACCURACY )
Gérer comment? Quelle gestion souhaites-tu? Quel est le contexte?
Si tu veux dire détecter l'underflow, il faut préciser ce que tu entends par underflow :
- quand le résultat mathématique est trop petit, la soustraction donne 0 (implémentation non-IEEE)
- quand le résultat mathématique est trop petit, résultat de la soustraction perd en précision relative, sa mantisse est raccourcie (implémentation IEEE)
Le test a effectuer, dans chaque cas :
- x != y && z == 0
- z != 0 && fabs(z) < DBL_MIN
Partager