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 )
Merci.
Essentiellement, ce qui m'interesse est de capturer l'erreur et de ramener alors la différence des 2 nombres à zéro. L'erreur est surtout visible dans Excel. Elle peut bien sûr être traitée en VBA, mais je cherche à ce que le traitement soit dans la DLL en C.
donne un exemple, parce que la on nage un peu![]()
Je crois qu'il est plus logique de comparer l'erreur relative plutôt que l'erreur absolue qui n'a pas grand sens compte tenu de la représentation des flottants
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #define ACCURACY 0.000001 .... if ( fabs(a-b) <= ACCURACY * (fabs(a)+fabs(b)))
tout depend.. Dans la plupart des cas que j'ai eu a traiter, l'erreur absolue etait la regle :
- si Delta temperature < 0.5 degres
- si Delta euro < 0.01
- etc etc...
il n'y a que dans certains cas que tu veux un traitement relatif...
Mais par exemple pour un algo de convergence de resolution d'une formule de maths, si tu n'es pas en maths pures mais en physique ou chimie, tu SAIS que ta precision sera au maxi de 10^-3, -4, ou -6...
et ca fait des operations en moins (dont des divisions) pour du temps reel....
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
oui
La norme C99 précise que ce doit être dans le fichier <float.h>, et avant, c'était assez souvent dans le fichier <limits.h> ou <maths.h>.
Tu as les liens ici :
http://www.developpez.net/forums/sho...5&postcount=21
Parce que un nombre flottant multiplié par 10000 par exemple, et représentant des euros, te donne en eniter la valeur du 10 millième d'euro !!! et que je veux bien qu'on tente d'être précis, mais à moins d'extra, pour ce que tu souhaites faire, ça me semble nettement suffisant..
Non..
Mais
smallest number x such that 1.0 + x != 1.0",
Partager