IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

underflow / overflow


Sujet :

Bibliothèque standard C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 45
    Par défaut underflow / overflow
    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)

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par me_myself Voir le message
    comment gérer l'underflow sur z ?


    Que veux-tu dire ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 45
    Par défaut
    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

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je repete : que veux-tu dire par "underflow" ????????????????????

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 45
    Par défaut
    oops sorry...

    une valeur trop proche de zéro, l'exact opposé de l'overflow, nombre trop grand pour la capacité d'un 'double'.

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 525
    Par défaut
    Citation Envoyé par me_myself Voir le message
    J'ai une DLL écrite en C qui est interfacée à Excel.

    bv
    "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++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 45
    Par défaut
    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.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( (a - b) == DBL_EPSILON )
    ce qui equivaut a

    Ou bien, si tu veux tester par rapport a une petite valeur :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define ACCURACY 0.000001
     
    if ( fabs(a-b) <= ACCURACY )

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 45
    Par défaut
    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.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    donne un exemple, parce que la on nage un peu

  11. #11
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define ACCURACY 0.000001
     
    if ( fabs(a-b) <= ACCURACY )
    Je pense que c'est la bonne approche. De toute manière, si tu travailles sur la convergence d'une variable, il faut obligatoirement que tu définisses un seuil en-dessous duquel tu considères qu'il y a convergence. A toi de choisir ce seuil plus grand que la valeur limite.

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par corentin59 Voir le message
    Je pense que c'est la bonne approche. De toute manière, si tu travailles sur la convergence d'une variable, il faut obligatoirement que tu définisses un seuil en-dessous duquel tu considères qu'il y a convergence. A toi de choisir ce seuil plus grand que la valeur limite.
    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)))

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    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....

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par me_myself Voir le message
    double x,y,z;
    z = x - y;

    comment gérer l'underflow sur z ?
    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 :
    1. quand le résultat mathématique est trop petit, la soustraction donne 0 (implémentation non-IEEE)
    2. 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 :
    1. x != y && z == 0
    2. z != 0 && fabs(z) < DBL_MIN

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Tu as donc un DBL_EPSILON (ou EPSILON_DBL, je neme souviens plus) qui donne la plus petite variation mesurable entre 2 doubles.
    Tu es sûr?

    Citation Envoyé par souviron34 Voir le message
    Donc je ferais simplement une multiplication par 10000, ou quelque chose comme ca, si la valeur est < 1.
    Pourquoi faire cela?

    Citation Envoyé par souviron34 Voir le message
    Sinon, si tu veux tester par rapport a zero, tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( (a - b) == DBL_EPSILON )
    ce qui equivaut a

    Ah bon? DBL_EPSILON = 0?

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par corrector Voir le message
    Tu es sûr?
    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


    Citation Envoyé par corrector Voir le message
    Pourquoi faire cela?
    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..


    Citation Envoyé par corrector Voir le message
    Ah bon? DBL_EPSILON = 0?
    Non..

    Mais
    smallest number x such that 1.0 + x != 1.0",

Discussions similaires

  1. Overflow ou underflow
    Par jerem721 dans le forum C
    Réponses: 4
    Dernier message: 11/02/2012, 11h30
  2. Réponses: 3
    Dernier message: 16/09/2004, 14h11
  3. [Erreur] buffer overflow
    Par cmoulin dans le forum Administration
    Réponses: 8
    Dernier message: 04/08/2004, 14h36
  4. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16
  5. [LG]floation point overflow
    Par mikoeur dans le forum Langage
    Réponses: 8
    Dernier message: 10/07/2003, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo